2013-12-17 72 views
-1

是這樣的:這兩個自動執行的匿名Javascript函數是否相同?

(function(a) { 
    return 3; 
})(this); 

等同於:

(function() { 
    return 3; 
})(); 

如果有任何差異,請解釋

+5

它們是平等的,因爲您對該參數不做任何處理。 – DontVoteMeDown

+0

@DontVoteMeDown:Javascript中的參數是否可選?因爲除非它們是這兩個函數,否則它們是不相等的。 –

+0

@RobertHarvey他們是,你可以傳遞任意數量的參數給一個函數,即使沒有定義它們,它們也可以通過參數數組訪問。任何未被超越的參數都是未定義的。 –

回答

2

這是我認爲你正在尋找的區別:第二個例子有(通過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 
})(); 
+0

感謝您向我介紹影子概念。我沒有意識到這一點,所以我很難說出問題,謝謝! – user2202911

0

好了,首先你要傳遞的參數,但它從未使用過。但是,兩者的功能是相同的。第二個稍微快一些,因爲沒有理由沒有通過一個論點,假設這不是最優化的。

+2

你有一個基準來證明它的速度更快嗎?似乎它可能依賴於解析器的優化。 –

+0

@MichaelBerkowski,你說得很好。重寫 –

0

這取決於您如何定義等效

如果你根據實際功能來定義它,那麼,是的,它們是等價的。當然,這隻適用於他們目前的內容。一個區別是,第一個可以訪問外部this,而第二個不能 - 雖然這在你的例子中並不重要。

關於你的評論是否僅僅通過this在這裏有所作爲:不,它不。

如果以不同的方式定義等效,則功能可以是不同的,例如當定義等價物具有相同的元數。

我想明顯的反問就是你的問題背後的用例是什麼:爲什麼你要問這個問題? (如果它不只是出於好奇和跑位的原因。)

+0

我想了解,如果「這個」變量在幕後有什麼不同。 – user2202911

+0

不,它沒有(見我更新的答案)。 –

+0

我不明白「this」的用途是什麼,我看到一個使用這種風格的開源的javascript庫,我試圖理解它。我會做更多的研究,並回來一個更好的定義問題。 – user2202911