2017-06-03 28 views
4

正如你在Javascript知道,這是很常見的使用下列表達式作爲IIFE mmediately nvoked ˚F油膏Ë上的表達):我們可以說這是一個IIFE - ?!?在Javascript中

(function(){ 
    //code ... 
})(); 

我想知道,如果我們可以說,下面表達IIFE(當沒有返回值需要):

new function(){ 
//code ... 
} 

或者

new function(global){ 
    //code.. 
}(this); 

即使它是一個對象。謝謝 。

答:

[感謝@le_m,@ vol7ron和@Bergi,這裏是一個簡短的回答] 我們可以說,他下面的表達式是IIFE mmediately nvoked F聯合E xpression)?

new function(){ 
//code ... 
} 

或者

new function(global){ 
    //code.. 
}(this); 

答案是NO 。 那是什麼? 這只是一個匿名構造函數的匿名對象,所以我們不是在這裏討論函數(plain and simple)。

+4

如果您希望其他開發人員瞭解您指的是什麼,請不要這樣做。 – charlietfl

+0

我很驚訝這個模式實際工作,沒有遇到過這個。該函數中的代碼立即執行,所以我想你可以將它稱爲IIFE –

+0

謝謝@PatrickHund – Bbird

回答

2

new function(){ ... }IIFE

現在,IIFE代表 mmediately nvoked ˚Fê的表達。和FunctionExpression定義如下:

功能BindingIdentifierₒₚₜ(FormalParameters ){函數體}

那麼,我們處理的功能體現在哪裏?讓我們analyze your syntax

"type": "ExpressionStatement", 
"expression": { 
    "type": "NewExpression", 
    "callee": { 
     "type": "FunctionExpression", 
     "params": [], 
     "body": { 
      ... 
    }, 
    "arguments": [] 
} 

這告訴我們,你的代碼不是函數表達式,但它包括函數表達式作爲NewExpression的一部分。

該表達式是否立即被調用?某種意義上說,是的 - 見[[Construct]] invocation。構造函數立即被調用。

不過,我不會把整個事情的IIFE作爲外部表達不是函數表達式。有些人稱這種表達爲Immeditately Invoked Constructor or IIC(感謝@ vol7ron,@Bergi指出了這一點)。

+0

我想這會出現,尤其是因爲使用'new'關鍵字。將會涉及到一些技術語義,我期待閱讀其他人如何解釋這一點。 – vol7ron

+0

Yah,但正如你所知,javascript中的函數是特殊對象,我在這裏做的是用匿名構造函數(一個函數)創建一個對象。所以函數(方法)在場景後面調用。 – Bbird

+1

'new Function'正在調用一個函數構造函數,它在內部創建一個函數對象。我認爲@le_m在技術上是正確的。函數聲明,表達式和對象之間有區別。我認爲這些語義在「IIFE」的意義上起作用。 *函數表達式*是首字母縮寫詞的意思,還是包含內部調用的函數表達式(函數體/語句),它們是使用'new Function'構造函數立即調用的? – vol7ron

3

是的,它是立即調用的函數表達式(IIFE),儘管這種模式通常不被使用。

MDN Docs

IIFE(立即調用函數表達式)是,一旦它被定義運行一個JavaScript 功能。

new function(){ 
//code ... 
} 

所以根據定義,你的例子是一個JavaScript函數並立即運行的定義。

Wikipedia

一個立即調用的函數expressio是JavaScript編程語言慣用法產生使用JavaScript的功能範圍界定一個 詞法範圍。立即調用 函數表達式可用於避免在塊內從 提升變量,防止污染全局環境,同時允許公開訪問方法,同時保留函數中定義的變量的隱私 。

在上述示例中,模式確實爲定義中的變量提供了詞法範圍,並將方法和定義封裝在全局環境中。

相關問題