我们可以说这是一个IIFE吗?!? - 在Javascript中

时间:2017-06-03 14:41:59

标签: javascript iife

正如您在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)。

2 个答案:

答案 0 :(得分:3)

是的,它是立即调用的函数表达式(IIFE),尽管通常不使用此模式。

来自https://i.gyazo.com/65bb8c9fa02d007a8ed8d3d465412e4f.png

  

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指出这一点)。