javascript學習筆記(13)--箭頭函數

ES6標準新增了一種新的函數:ArrowFunction(箭頭函數)
它用箭頭定義
x => x * x
相當於
function (x) { return x * x; }

箭頭函數相當於匿名函數,並且簡化了函數定義
箭頭函數有兩種格式,一種像上面的,只包含一個表達式,連{ … }和return都省略掉了
還有一種可以包含多條語句,這時候就不能省略{ … }和return

 x => {
 if (x > 0) {  return x * x; }
 else {return - x * x; } 
 }

如果參數不是一個,就需要用括號()括起來
兩個參數

 (x, y) => x * x + y * y

無參數

 () => 3.14 

可變參數:

 (x, y, ...rest) => {
  var i, sum = x + y;
  for (i=0; i<rest.length; i++) { sum += rest[i]; }
  return sum; 
  }

如果要返回一個對象,就要注意,如果是單表達式,這麼寫的話會報錯

var a=x => { foo: x } ;//這一步不會報錯
a(1).foo
TypeError: a(...) is undefined

因爲和函數體的{ … }有語法衝突,所以要改爲

var a= x => ({ foo: x })
a(1).foo
1

箭頭函數看上去是匿名函數的一種簡寫,但實際上,箭頭函數和匿名函數有個明顯的區別
箭頭函數內部的this是詞法作用域,由上下文確定

回顧前面的例子,由於JavaScript函數對this綁定的錯誤處理,下面的例子無法得到預期結果

 var obj = { 
 birth: 2000, 
 getAge: function () { 
 var fn = function () {
  return new Date().getFullYear() - this.birth;  };
  return fn(); } 
  };
  obj.getAge()
NaN

因爲只有在obj的方法裏的最外層函數this指向對象,方法裏的函數指向window(undefined)

箭頭函數完全修復了this的指向,this總是指向詞法作用域,也就是外層調用者obj

 var obj = { 
 birth: 2000, 
 getAge: function () { 
 var fn = () => new Date().getFullYear() - this.birth; return fn(); }
  };
obj.getAge()
20

由於this在箭頭函數中已經按照詞法作用域綁定了,所以,用call()或者apply()調用箭頭函數時,無法對this進行綁定,即傳入的第一個參數被忽略

var obj = { 
birth: 2000,
 getAge: function () { 
 var fn = () => new Date().getFullYear()- this.birth; 
 return fn.apply(window); …
obj.getAge()
20

本來把this綁定到window會返回NaN,但這裏正常返回,說明無效

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章