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

Can we say this is an IIFE ?!?- In Javascript

如您所知,在 Javascript 中,将以下表达式用作 IIFEImmediately Invoked Function Expression) :

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

我想知道我们是否可以说下面的 表达式 是一个 IIFE(当不需要 return 值时):

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

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

即使它是一个对象。谢谢.

答案:

[感谢@le_m、@vol7ron 和@Bergi,这里是简短的回答] 我们可以说他下面的表达式是 IIFE (Immediately Invoked Function Expression) ?

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

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

答案是。 那是什么? 它只是一个带有匿名构造函数的未命名对象,所以我们在这里不讨论函数(plain and simple)。

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

来自MDN Docs

IIFE (Immediately Invoked Function Expression) is a JavaScript function that runs as soon as it is defined.

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

所以根据定义,您的示例是一个 Javascript 函数并立即运行定义。

来自Wikipedia

An immediately-invoked function expressio is a JavaScript programming language idiom which produces a lexical scope using JavaScript's function scoping. Immediately-invoked function expressions can be used to avoid variable hoisting from within blocks, protect against polluting the global environment and simultaneously allow public access to methods while retaining privacy for variables defined within the function.

在上述示例中,该模式确实为定义中的变量提供了词法作用域,并封装了来自全局环境的方法和定义。

new function(){ ... }IIFE 吗?

现在,IIFE代表I立即Invoked F 作用E表达。而一个FunctionExpression定义如下:

function BindingIdentifierₒₚₜ ( 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、@Bergi 指出了这一点)。