帶名函數是指函數顯示地給出了一個名字的函數,function abs(x){}。匿名函數是指函數只帶有function這個關鍵字,而沒有像abs這種函數名稱的函數,如function(){}。 ES6標準新增了一個新的函數:Arrow Function(箭頭函數)箭頭函數表面上相當於匿名函數,並且簡化了函數定義。它們各自的差別是什麼呢?
1 帶名和匿名函數的區別
區別:匿名函數需要講地址賦值給另一個變數let a,然後再用a來調用函數;而帶名函數因為顯示地給出了函數名稱,所以可以直接用這個函數名稱呼叫。
帶名函數傳回值是函數體內的回傳值,如abs(x)函數的回傳值是number變數。函數調用時,直接abs(6)調用,這個非常好理解。
function abs(x){ if(x>=0){ return x; }else{ return -x; } }
但是匿名函數呢?如下所示,函數未顯示地給出一個函數名稱,但是此處的abs被賦值為這個匿名函數的位址,所以使用時可以直接用abs(-3),諸如此類的呼叫。
let abs=function(x){ if(x>=0){ return x; }else{ return -x; } }
2 箭頭函數
ES6標準新增了一個新的函數:Arrow Function(箭頭函數)。為什麼叫Arrow Function?因為它的定義用的就是一個箭頭。箭頭函數表面上相當於匿名函數,並且簡化了函數定義。
箭頭函數有兩種格式,一種是只包含一個表達式,連{ … }和return都省略掉了。
x => x * x
上面的箭頭函數相當於一個匿名函數「」
function (x) { return x * x; }
還有一個可以包含多條語句,這時候就不能省略{ … }和return:
(x,y) => { if (x > 0) { return x + y; } else { return -x + y; } }
var obj1 = { birth: 1990, getAge: function (year) { let fn=function(y){ return y - this.birth; // this指向window或undefined }; return fn(year); } }; var obj2 = { birth: 1990, getAge: function (year) { var fn = (y) => y - this.birth; // this.birth为1990 return fn(year); } };