JavaScript 中的表達式閉包和函數呼叫相同嗎?
在JavaScript 中,以下程式碼片段似乎會產生相同的輸出:
<code class="js">(function() { bar = 'bar'; alert('foo'); })(); (function() { bar = 'bar'; alert('foo'); }());</code>
兩個區塊都執行alert('foo')語句並聲明一個可在閉包外部存取的變數bar。唯一明顯的差異在於閉包的語法,使用 )()} 與 }());。
這些構造在功能上等效嗎?
答案:是的,它們是相同的。
其他注意事項:
如果引入附加括號,行為會改變。考慮以下場景:
場景 1:
<code class="js">new (function() { this.prop = 4; })().prop;</code>
此表達式建立函數類別的新實例並存取新實例的 prop 屬性,傳回值 4。它相當於:
<code class="js">function MyClass() { this.prop = 4; } new MyClass().prop;</code>
場景 2:
<code class="js">new ( function() { return { Class: function() { } }; }() ).Class;</code>
在這種情況下,新表達式實例化函數的 Class 屬性傳回值。函數呼叫周圍的括號至關重要,表示應立即呼叫該函數。
這相當於:
<code class="js">var namespace = { Class: function() { } }; function getNamespace() { return namespace; } new ( getNamespace() ).Class; // Or, new namespace.Class;</code>
如果從 getNamespace() 的呼叫中刪除了括號,表達式將實例化 getNamespace 類別並存取新實例的 Class 屬性。
以上是JavaScript 函數呼叫和閉包中的括號總是只是語法糖嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!