正如您在Javascript中所了解的那样,将以下表达式用作 IIFE (我立即我 nvoked)非常常见 F 取消 E xpression):
(function(){
//code ...
})();
我想知道我们是否可以说以下表达式是 IIFE (当不需要返回值时):
new function(){
//code ...
}
或
new function(global){
//code..
}(this);
即使它是一个对象。谢谢。
答案:
[感谢@le_m,@ vol7ron和@Bergi,这里是简短回答] 我们可以说他的下面的表达是 IIFE (我立即我 nvoked F unction E < / strong> xpression)?
new function(){
//code ...
}
或者
new function(global){
//code..
}(this);
答案是否。 那是什么? 它只是一个带有匿名构造函数的未命名对象,所以我们不在这里谈论函数(plain and simple)。
答案 0 :(得分:3)
是的,它是立即调用的函数表达式(IIFE),尽管通常不使用此模式。
IIFE(立即调用函数表达式)是一个JavaScript 一旦定义就运行的函数。
new function(){
//code ...
}
因此根据定义,您的示例是Javascript函数并立即运行定义。
来自MDN Docs:
一个立即调用的函数expressio是一个JavaScript编程语言习惯用法,它产生一个 使用JavaScript的函数范围的词法范围。立即调用的 函数表达式可用于避免变量提升 在街区内,防止污染全球环境和 同时允许公众访问方法,同时保留隐私 对于函数中定义的变量。
在上述示例中,模式确实为定义中的变量提供了词法范围,并封装了全局环境中的方法和定义。
答案 1 :(得分:2)
new function(){ ... }
是 IIFE 吗?
现在, IIFE 代表我立即我 nvoked F unction E 的表达。 FunctionExpression的定义如下:
functionBindingIdentifierₒₚₜ(FormalParameters ){FunctionBody}
那么,我们处理函数表达式吗?让我们analyze your syntax:
"type": "ExpressionStatement",
"expression": {
"type": "NewExpression",
"callee": {
"type": "FunctionExpression",
"params": [],
"body": {
...
},
"arguments": []
}
这向我们展示了您的代码不是函数表达式,但它包含函数表达式作为NewExpression的一部分。
是否立即调用此表达式?在某种程度上,是的 - 见[[Construct]] invocation。立即调用构造函数。
尽管如此,我还是不会将整个事情称为 IIFE ,因为外部表达式不是函数表达式。有些人将此表达式称为Immeditately Invoked Constructor or IIC(感谢@ vol7ron,@ Berger指出这一点)。