之前在看Vue2.0的時候,就被很多的箭頭函式困擾,一直不知道是怎麼回事,雖然箭頭函式四個字在我耳邊一直轉圈,今天小編整理整理箭頭函式裡面的常見用法和表現形式,在這個Vue3.0已經到來的一段時間,希望大家也可以一起搭上箭頭函式的大風飛起來。大家也可以關注我的微信公眾號,蝸牛全棧。
一、es5中函式的宣告方式
function sum(x,y){ return x + y } console.log(sum(4,5)) // 9
let sum = function(x,y){ return x + y } console.log(sum(4,5)) // 9
對於上面的兩種方式,主要區別在於let 關鍵字宣告函式的時候,不存在變數提升的問題(ps:具體可以參考小編的第一篇文章,關鍵字let和var的區別)
二、es6中的箭頭函式:主要就是把function去掉,在引數和函式體之間用箭頭分割
let sum = (x,y) => { return x+y } console.log(sum(3,4)) // 7
對於函式體只有一行程式碼的時候,上面程式碼可以簡化為以下程式碼
let sum = (x,y) => x + y
對於返回值,可以省略return關鍵字並用圓括號擴起來
function addStr(str1,str2){ return str1+str2 } const addStr = (str1,str2) => (str1+str2) // 以上兩個函式功能是一樣的,只是箭頭函式在箭頭右側,省略了關鍵字return,並且在外面新增圓括號
三、箭頭函式和普通函式之間的區別
1、this指向定義時所在的物件,而不是呼叫時所在的物件(箭頭函式中沒有this,this指向的是父級的this)
<html> <body> <button id="btn">點我</button> <script> let oBtn = document.querySelector("#btn") oBtn.addEventListener("click",function(){ console.log(this) // <button id="btn">點我</button> }) </script> </body> </html>
<html> <body> <button id="btn">點我</button> <script> let oBtn = document.querySelector("#btn") oBtn.addEventListener("click",function(){ setTimeout(function(){ // call apply bind改變this指向 console.log(this) // Window },1000) }) </script> </body> </html>
通過bind改變this指向
<html> <body> <button id="btn">點我</button> <script> let oBtn = document.querySelector("#btn") oBtn.addEventListener("click",function(){ setTimeout(function(){ console.log(this) // <button id="btn">點我</button> }.bind(this),1000) }) </script> </body> </html>
箭頭函式中的this指向
<html> <body> <button id="btn">點我</button> <script> let oBtn = document.querySelector("#btn") oBtn.addEventListener("click",function(){ setTimeout(() => { console.log(this) // <button id="btn">點我</button> },1000) }) </script> </body> </html>
2、不可以作為建構函式
function People(name,age){ console.log(this) // People{} this.name = name this.age = age } let p1 = People("lilei",34) console.log(p1) // People{name:"lilei",age:34}
let People = (name,age) => { this.name = name this.age = age } let p1 = People("lilei",34) console.log(p1) // 報錯 People is not a constrator
3、不可以使用arguments物件
let foo = function(){ console.log(arguments) } console.log(foo(1,2,3)) // Arguments[1,2,3]
let foo = () => { console.log(arguments) } console.log(foo(1,2,3)) // Arguments is not defined
箭頭函式相容類似es5中arguments物件:通過rest引數
let foo = (...args) => { console.log(args) } console.log(foo(1,2,3)) // [1,2,3]