1. 程式人生 > >function 與 => 的區別

function 與 => 的區別

fin 參數 其它 cal 利用 否則 毫秒 console 而是

在JS中,箭頭函數並不是簡單的function(){}匿名函數的簡寫語法糖,實際上,箭頭函數和匿名函數有個明顯的區別:箭頭函數內部的this是詞法作用域,在編寫函數時就已經確定了。而匿名函數的this指向運行時實際調用該方法的對象,無法在編寫函數時確定。

我們看一下下面的例子:

 1 function Test() {
 2     this.num = 100;
 3 
 4     this.func = function(){
 5         console.log(this.num); // 100
 6         setTimeout(function(){
 7
console.log(this.num); // undefined 8 }, 500); 9 }; 10 } 11 12 var obj = new Test(); 13 obj.func();

這裏的方法裏調用了setTimeout函數,該函數500毫秒後調用我們定義的函數時,實際上是window對象調用的,所以這時匿名函數的this是指向window而不是指向obj了。

在箭頭函數出現之前一般都是這麽寫的:

 1 function Test() {
 2     this.num = 100;
 3 
 4     this
.func = function(){ 5 console.log(this.num); // 100 6 var that = this; 7 setTimeout(function(){ 8 console.log(that.num); // 100 9 }, 500); 10 }; 11 } 12 13 var obj = new Test(); 14 obj.func();

這是利用了閉包的概念。箭頭函數可以看做這種方式的語法糖。

如下:

 1 function Test() {
2 this.num = 100; 3 4 this.func = function(){ 5 console.log(this.num); // 100 6 setTimeout(() => { 7 console.log(this.num); // 100 8 }, 500); 9 }; 10 } 11 12 var obj = new Test(); 13 obj.func();

箭頭函數和普通函數的區別

  • 不可以當做構造函數,也就是說,不可以使用 new 命令,否則會拋出錯誤。
  • this、arguments、caller等對象在函數體內都不存在。
  • 不可以使用 yield 命令,因此箭頭函數不能用作 Generator 函數。

總結

箭頭函數除了傳入的參數之外,其它的對象都沒有!在箭頭函數引用了this、arguments或者參數之外的變量,那它們一定不是箭頭函數本身包含的,而是從父級作用域繼承的。

function 與 => 的區別