JavaScript 中的函數呼叫語法:「(function ( ) { } ) ( )」和「(function ( ) { } ( ) )」功能相同嗎?
問題:
考慮以下兩個JavaScript 程式碼區塊:
(function() { bar = 'bar'; alert('foo'); })(); alert(bar);
(function() { bar = 'bar'; alert('foo'); }()); alert(bar);
兩個程式碼區塊都會執行alert ('foo' ) 接著是alert(bar),分別顯示「foo」和「bar」。兩者之間的唯一差異是函數呼叫的語法。它們的功能相同嗎?
答案:
是的,一般來說,這兩個程式碼區塊在功能上是等效的。它們都會定義一個新函數,立即執行它,然後在全域範圍內存取 bar 變數。
例外:
但是,存在以下邊緣情況:這兩種語法的行為可能不同。具體來說,如果您在函數之前或函數內的 .something 之後引入新程式碼,它們的行為將不再相同。
程式碼 1:
new (function() { this.prop = 4; }) ().prop;
此程式碼建立函數類別的新實例並擷取新實例的 prop 屬性,並傳回 4。它相當於:
function MyClass() { this.prop = 4; } new MyClass().prop;
程式碼 2:
new ( function() { return { Class: function() { } }; }() ).Class;
此程式碼在 Class 屬性上呼叫 new。由於函數呼叫的括號位於外括號內,因此它們不會觸發 new 表達式,而是正常呼叫函數,並傳回其傳回值。新表達式實例化 .Class 並實例化它。它相當於:
var namespace = { Class: function() { } }; function getNamespace() { return namespace; } new ( getNamespace() ).Class; //Or, new namespace.Class;
如果在呼叫getNamespace() 時沒有括號,此程式碼將解析為(new getNamespace()).Class,實例化getNamespace 類別並傳回該類別的Class 屬性新實例。
以上是JavaScript 中的「(function () { } ) ( )」和「(function () { } ( ) )」功能相同嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!