簡體   English   中英

命名和未命名的匿名Javascript函數之間的差異

[英]Differences Between Named and Unnamed Anonymous Javascript Functions

通常,在Javascript中,當我想將匿名/內聯函數作為參數傳遞給另一個函數時,我會執行以下操作之一。

someFunctionCall(function() {
    //...
});

someFunctionCall( () => {
    //...
});

但是,我最近繼承了一個使用命名函數作為內聯參數的代碼庫,就像這樣

someFunctionCall(function foo() {
    //...
});

我以前從未見過這種語法。 該函數似乎仍然是匿名的 - 在調用或調用范圍中沒有定義foo函數。 這只是一種風格問題,還是可以使用命名函數(上面的foo )作為匿名函數來改變該程序的行為或狀態?

這是專門針對NodeJS(不是基於瀏覽器的程序)程序,我特別關注使用函數作為參數的行為。 這表示來自跨平台和運行時的行為的信息是受歡迎的。

使用命名函數表達式而不是匿名函數表達式至少有三個優點。

  • 當函數名稱顯示在調用層次結構中時,可以更輕松地進行調試。
  • 函數名稱可在函數的內部范圍內訪問,因此可用於遞歸
  • 函數名稱本身就像是函數正在執行的自我文檔而不是讀取代碼。

使用那些“命名的匿名函數”不會改變行為,但會在堆棧跟蹤中顯示函數名稱,這非常有用。 此函數也可以通過這種方式在其自身內調用。

我舉個例子

情況1:

var obj =  {count: 0, counter: ()=> {this.count+=1;}}

如果你做console.log(obj.count)你會得到0

案例2:

var obj  = {count: 0, counter (){this.count+=1;}}

在第二種情況下,如果你做console.log(obj.count)值將是一個。

希望你現在明白了。 Lamda表達式無法通過引用此對象來訪問值。 它只能訪問具有全局引用的變量。

在案例1中如果你想使它與lamba一起工作,你必須使用obj.count + = 1,名稱有引用。

其余的JavaScript函數實現保持不變,沒有太大區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM