【问题标题】:Can we say this is an IIFE ?!?- In Javascript [duplicate]我们可以说这是一个 IIFE 吗?!?-在 Javascript [重复]
【发布时间】:2017-06-03 14:41:59
【问题描述】:

正如您在 Javascript 中所知道的,将以下表达式用作 IIFEI立即I调用 F unction Expression):

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

我想知道我们是否可以说以下 表达式IIFE(不需要返回值时):

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

或者

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

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

答案:

[感谢@le_m、@vol7ron 和@Bergi,这是简短的回答] 我们可以说他下面的表达式是一个IIFEI立即I调用Function Expression) ?

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

或者

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

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

【问题讨论】:

  • 如果您希望其他开发人员理解您所指的内容,则不是。
  • 我很惊讶这种模式确实有效,还没有遇到过。函数中的代码会立即执行,所以我猜你实际上可以称它为 IIFE
  • 是的@Bbird,但这通常是不好的做法。但是,由于建议将'use strict'; 放在功能块内,这并不意味着这在未来不会成为普遍接受的做法。
  • @vol7ron 你是说模式本身是不好的做法吗?在为 ES2015 之前的环境编码时,我经常使用它。当您想要构造一个对象并为至少一个键名评估表达式时,它非常有用,因为在 ES2015 中添加计算属性名称之前,您无法使用对象字面量来执行此操作。
  • @Paulpro 是的,出于与 所述的相同原因,这不是常见的做法,因此是不好的做法。社区已经从需要更少代码和更高性能的地方转变为需要更好的可维护性的地方。大量研究表明,当维护成本(由于时间、复杂性等)较低时,可以节省更多的钱。当然,你可能使用得当——我无法从这里做出判断;)

标签: javascript iife


【解决方案1】:

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

来自MDN Docs

IIFE(立即调用函数表达式)是一种 JavaScript 定义后立即运行的函数。

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

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

来自Wikipedia

立即调用函数 expressio 是一种 JavaScript 编程语言习语,它产生一个 使用 JavaScript 的函数作用域的词法作用域。立即调用 函数表达式可用于避免变量提升 在街区内,防止污染全球环境和 同时允许公众访问方法,同时保留隐私 对于函数中定义的变量。

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

【讨论】:

    【解决方案2】:

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

    现在,IIFE 代表 I立即I调用 Function E表达。而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 指出这一点)。

    【讨论】:

    • 我认为这会出现,特别是因为使用了 new 关键字。将涉及一些技术语义,我期待阅读其他人如何解释这一点。
    • 是的,但如你所知,javascript 中的函数是特殊对象,而我在这里所做的是使用匿名构造函数(A 函数)创建对象。所以函数(方法)在幕后被调用。
    • new Function 正在调用一个函数构造函数,它在内部创建一个函数对象。我认为@le_m 在技术上是正确的。函数语句、表达式和对象之间存在区别。我想语义会影响“IIFE”的含义。首字母缩略词中的function expression是指语法,还是它还包括使用new Function构造函数立即调用的内部调用的函数表达式(函数体/语句)?
    • ICFE - 立即构造 函数表达式怎么样? :-P
    • 如果你要走那条路,你不妨参考它,因为它在其他地方更常见 (IIC),这让我想到了一个书签 I几年前从未跟进:2ality.com/2013/11/immediately-invoked.html
    猜你喜欢
    • 2019-01-11
    • 2021-11-20
    • 2019-09-13
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2022-08-15
    相关资源
    最近更新 更多