是這樣的:這兩個自動執行的匿名Javascript函數是否相同?
(function(a) {
return 3;
})(this);
等同於:
(function() {
return 3;
})();
如果有任何差異,請解釋
是這樣的:這兩個自動執行的匿名Javascript函數是否相同?
(function(a) {
return 3;
})(this);
等同於:
(function() {
return 3;
})();
如果有任何差異,請解釋
這是我認爲你正在尋找的區別:第二個例子有(通過a
變量)訪問外部this
,而第二個例子呢不。
通常情況下,你不需要的參數傳遞給一個IIFE(雖然你當然可以,以獲得更多的可讀或模塊化的代碼),因爲新聲明的函數可以訪問他們的外部範圍的變量:
var foobar = 5;
(function() {
// I can use the outer-scope `foobar` in here!
})();
然而,this
是一個特例,因爲新創建的功能將有它自己的this
將陰影外this
:
// outer here, `this` is one thing
(function() {
// in here, `this` might be something else
// because each new functions invocation sets `this` within the function
})();
你可以看到陰影的行爲與非this
變量是這樣的:
var foobar = 5;
(function() {
var foobar = 7;
// I can't use the outer-scope `foobar`
// because it is shadowed by local-scope `foobar`
})();
類似的事情發生與this
。在我的foobar
示例中,陰影是明確完成的,但是this
始終發生陰影,因爲每個函數都獲得一個新的本地範圍this
。
您可以通過別名它一個新名稱訪問外this
,通過正式的說法在這裏完成:
// outer here, `this` is one thing
(function(outerThis) {
// in here, `this` might be something else
// but `outerThis` refers to the outer `this`
})(this);
如果你不別名外this
到一個新的名稱,您將無法訪問它,因爲它會被當地this
遮蔽。請注意,您也可以將您的外部this
別名爲另一個外部變量,如:
var outerThis = this;
(function() {
// we can access the outer-scope `outerThis` because it is not shadowed
})();
感謝您向我介紹影子概念。我沒有意識到這一點,所以我很難說出問題,謝謝! – user2202911
好了,首先你要傳遞的參數,但它從未使用過。但是,兩者的功能是相同的。第二個稍微快一些,因爲沒有理由沒有通過一個論點,假設這不是最優化的。
你有一個基準來證明它的速度更快嗎?似乎它可能依賴於解析器的優化。 –
@MichaelBerkowski,你說得很好。重寫 –
這取決於您如何定義等效。
如果你根據實際功能做來定義它,那麼,是的,它們是等價的。當然,這隻適用於他們目前的內容。一個區別是,第一個可以訪問外部this
,而第二個不能 - 雖然這在你的例子中並不重要。
關於你的評論是否僅僅通過this
在這裏有所作爲:不,它不。
如果以不同的方式定義等效,則功能可以是不同的,例如當定義等價物具有相同的元數。
我想明顯的反問就是你的問題背後的用例是什麼:爲什麼你要問這個問題? (如果它不只是出於好奇和跑位的原因。)
我想了解,如果「這個」變量在幕後有什麼不同。 – user2202911
不,它沒有(見我更新的答案)。 –
我不明白「this」的用途是什麼,我看到一個使用這種風格的開源的javascript庫,我試圖理解它。我會做更多的研究,並回來一個更好的定義問題。 – user2202911
它們是平等的,因爲您對該參數不做任何處理。 – DontVoteMeDown
@DontVoteMeDown:Javascript中的參數是否可選?因爲除非它們是這兩個函數,否則它們是不相等的。 –
@RobertHarvey他們是,你可以傳遞任意數量的參數給一個函數,即使沒有定義它們,它們也可以通過參數數組訪問。任何未被超越的參數都是未定義的。 –