function 與 => 的區別


在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或者參數之外的變量,那它們一定不是箭頭函數本身包含的,而是從父級作用域繼承的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM