【问题标题】:What does this block of JS code mean? [duplicate]这段JS代码是什么意思? [复制]
【发布时间】:2011-08-26 20:05:59
【问题描述】:

可能重复:
What is the purpose of wrapping whole Javascript files in anonymous functions like “(function(){ … })()”?

我偶然发现了一个JS文件,可以总结为以下代码:

   (function(window){
              // some codes here
                    })(window);

我想知道这段代码是什么意思?窗口有特殊含义,还是只是一个参数?我们在括号中看到的两个“窗口”有什么区别?

由于这个函数没有名字,我假设它是一个匿名函数,所以它只被调用一次吗?什么时候调用?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    这称为立即调用的匿名函数。 (简称IIAF。)

    在这种情况下,您正在定义一个函数,该函数接受一个名为“window”的参数,该参数覆盖该范围内的全局window 对象。

    这里的关键是,在定义函数之后,你立即调用它,传入全局 window 对象,所以就好像你在函数闭包中使用了全局引用!

    大多数时候,这样做的目的是通过将所有潜在变量包装在匿名范围内来避免污染全局命名空间。

    【讨论】:

    • 这不是“自动执行”!这是“立即执行”。函数的任何部分都不会自行执行。
    • “self-invoked”会更准确。
    • 大部分正确但不完全正确。形参 window 在 iife 中创建一个局部变量,该变量传递对全局 window 的引用。它不会“覆盖”全局窗口,而是引用它。本地参数在作用域链上更高,因此将使用它而不是全局标识符,这通常称为“阴影”。但它们引用了相同的东西(不管它是什么)。
    【解决方案2】:

    就您关于window 的问题而言,底部括号中的window 是对全局window 对象的引用。第一个window 只是一个参数的名称。但在这种情况下,它指的是全局 window 对象,因为您使用的是匿名自调用函数。你可以称它为monkeys,它不会有什么不同(当然,你必须在匿名函数的主体中使用monkeys,然后才能引用参数)。所以现在,你现在在你的函数中有一个对全局窗口对象的引用。

    是的,该函数被调用一次,并且在定义后立即被调用。这是因为它是一个自调用的匿名函数。

    【讨论】:

    • 这不是模块模式。立即调用的函数表达式 (iife) 可以与 Richard Cornford 的模块模式一起使用,但它们是不同的东西。
    • @RobG 你是对的。那是下意识的反应。我会解决的。
    【解决方案3】:

    这是一个关闭。有问题的代码是一个匿名函数,它将使用“window”参数(sn-p 的结尾)执行。它不会污染全局命名空间。

    【讨论】:

      【解决方案4】:

      第一个窗口是形参,第二个是实际调用函数的实参。这种类型的函数称为自调用函数。 这样做的好处是,以这种方式包装函数不会使全局范围混乱..

      【讨论】:

        【解决方案5】:

        这是一个立即调用的函数表达式。围绕函数表达式(本质上是没有名称的函数声明)的分组运算符 () 意味着计算封闭的函数并返回函数对象。一个函数后跟一个形参列表(另一组 ())导致该函数被调用,所以:

        (function() {
          alert('hey');
        })();
        

        创建一个立即调用并运行一次的匿名函数。它不会创建任何全局变量,也不会留下任何存在的痕迹。

        将标识符window 传递给函数意味着它传递了它引用的任何内容。这里的假设(我想)是它将引用一个全局窗口对象,在浏览器中,它是全局对象。但是,在没有全局窗口对象的环境中,它很可能是未定义的。在我看来,这是一个毫无意义的练习。

        如果您担心获取对全局对象的引用,请从全局上下文中传递 this

        (function(global) {
          // global refernces the global object
        })(this);
        

        【讨论】:

          猜你喜欢
          • 2012-03-14
          • 1970-01-01
          • 2014-01-05
          • 1970-01-01
          • 2023-03-19
          • 2014-01-10
          • 2018-07-07
          • 1970-01-01
          • 2016-03-28
          相关资源
          最近更新 更多