2016-06-09 87 views
2

我需要幫助瞭解下面的腳本如何工作。爲什麼執行此功能?

var foo = function() { 
    console.log("A"); 
} 

(function() { 
    // Empty 
}) 

當運行該腳本與節點(v5.9.1)的輸出爲 「A」。我希望它什麼都不做。爲什麼在這裏執行foo?我可以刪除第一行或最後三行,然後沒有輸出。

  • 編輯:如果我在第3行的大括號後面加上;,它會按預期工作。但爲什麼?
+1

您可能應該在第3行放置一個分號,作爲結束語句。 (這是你不應該依賴ASI的人的一個原因!) – evolutionxbox

回答

8

如果將(...)緊接在函數表達式之後,則執行該函數。

問題中的代碼定義了一個調用console.log的函數。然後它調用該函數(傳遞一個函數的參數(這是不使用的),而函數什麼也不做)。然後它將調用第一個函數的返回值分配到foo

它可以被改寫爲:

var function_a = function() {console.log("A");}; 
var function_b = function() {}; 
var foo = function_a(function_b); 

...,唯一的副作用是在function_afunction_b變量的創建。


分號插入通常被認爲是有害的,因爲它會導致人們期望空白的語句分成兩個不相關的表達式。

JSHint會提醒你的問題:

7缺少分號。

+0

'(function(){...})()'和'function(){...}()'有什麼區別?然後? – JAyP

+1

@JAyP'function(){}()'如果單獨使用不是一個有效的語法。它適用於你的情況,因爲'var foo = ...'使它成爲一個表達式。 – freakish

+0

@JAyP - 取決於表達式左側顯示的內容。如果有其他的東西可以使第二個陳述成爲函數表達式,那麼實際上就沒有什麼實際效果。 – Quentin

2

的JavaScript解釋(...)如先前定義的函數(請注意,通過另一個函數作爲參數,這是在foo忽略)的調用,因爲有}(符號之間什麼都沒有。

1

與您的代碼

var foo = function() { 
    console.log("A"); 
} 

(function() { 
    // Empty 
}) 

的JavaScript解釋器閱讀本:

var foo = function() { 
    console.log("A"); 
}(function() {}); 

對於解釋你宣佈一個匿名函數,並把它傳遞一個參數,它沒有返回,那麼價值foo是undefined

這就是爲什麼在必要時將;放在行尾是非常重要的。