我需要幫助瞭解下面的腳本如何工作。爲什麼執行此功能?
var foo = function() {
console.log("A");
}
(function() {
// Empty
})
當運行該腳本與節點(v5.9.1)的輸出爲 「A」。我希望它什麼都不做。爲什麼在這裏執行foo?我可以刪除第一行或最後三行,然後沒有輸出。
- 編輯:如果我在第3行的大括號後面加上
;
,它會按預期工作。但爲什麼?
我需要幫助瞭解下面的腳本如何工作。爲什麼執行此功能?
var foo = function() {
console.log("A");
}
(function() {
// Empty
})
當運行該腳本與節點(v5.9.1)的輸出爲 「A」。我希望它什麼都不做。爲什麼在這裏執行foo?我可以刪除第一行或最後三行,然後沒有輸出。
;
,它會按預期工作。但爲什麼?如果將(...)
緊接在函數表達式之後,則執行該函數。
問題中的代碼定義了一個調用console.log
的函數。然後它調用該函數(傳遞一個函數的參數(這是不使用的),而函數什麼也不做)。然後它將調用第一個函數的返回值分配到foo
。
它可以被改寫爲:
var function_a = function() {console.log("A");};
var function_b = function() {};
var foo = function_a(function_b);
...,唯一的副作用是在function_a
和function_b
變量的創建。
分號插入通常被認爲是有害的,因爲它會導致人們期望空白的語句分成兩個不相關的表達式。
JSHint會提醒你的問題:
7缺少分號。
的JavaScript解釋(...)
如先前定義的函數(請注意,通過另一個函數作爲參數,這是在foo
忽略)的調用,因爲有}
和(
符號之間什麼都沒有。
與您的代碼
var foo = function() {
console.log("A");
}
(function() {
// Empty
})
的JavaScript解釋器閱讀本:
var foo = function() {
console.log("A");
}(function() {});
對於解釋你宣佈一個匿名函數,並把它傳遞一個參數,它沒有返回,那麼價值foo是undefined
這就是爲什麼在必要時將;
放在行尾是非常重要的。
您可能應該在第3行放置一個分號,作爲結束語句。 (這是你不應該依賴ASI的人的一個原因!) – evolutionxbox