为什么要编写一个 IIFE 来调用传递给它的另一个函数表达式?

问题描述 投票:0回答:2

CodeMirror.net 使用此构造(我稍微简化了)来引入其 JavaScript 编辑器的代码:

(function (mod) {
  this.CodeMirror = mod();
})(function () {
  "use strict";
   /* 15,000-odd lines of advanced JS */
})

现在,我明白这是一个 IIFE,并且我已经阅读了很多关于它们的帖子。 据我了解,实际上,这段代码正在创建一个 CodeMirror 对象。 我只是不明白其中的机制。

  1. 参数
    mod
    的作用是什么? 更广泛地说,当您向 IIFE 提供参数时,这意味着什么?
  2. 内部
    function
    表达式的作用是什么? 看来这和
    mod
    有某种关系?

感谢您的帮助。

javascript codemirror iife
2个回答
5
投票

在您的代码中:

(function(mod) {
    this.CodeMirror = mod();
})(function() {
  "use strict";
   (15,000-odd lines of advanced JS)
}

mod
是立即调用函数的形式参数。就好像函数是以更直接的方式声明的:

function something(mod) {
    this.CodeMirror = mod();
}

该函数显然期望

mod
参数将是对某个 other 函数的引用,因为它唯一做的就是用它进行函数调用。

立即调用的函数实际上是用一个函数作为

mod
参数的值来调用的:具体来说,就是这个:

function() {
  "use strict";
   (15,000-odd lines of advanced JS)
}

该函数会执行它所做的任何事情,并且(大概)返回一个对象引用以用作全局

CodeMirror
入口点。

因为第一个函数(即立即调用的函数)是在没有任何显式

this
值的情况下调用的,因此它期望将
this
设置为全局上下文的值,或者在浏览器中设置为
window
的值。我个人认为明确地这样做会更安全:

(function(mod) {
    this.CodeMirror = mod();
}).call(this, function() {
  "use strict";
   (15,000-odd lines of advanced JS)
})

在全局词法上下文中,is保证

this
将是对全局上下文的引用,无论是否是“严格”模式。但如果简单地调用外部立即调用的函数,那么在“严格”模式下
this
将是
undefined
并且初始化将会失败。


2
投票
(function(mod) {
  this.CodeMirror = mod();
})(function() {
    "use strict";
    //(15,000-odd lines of advanced JS)
})

这里没有发生任何奇怪或神奇的事情,这是流程:

  1. (function(mod) {
      this.CodeMirror = mod();
    })
    这声明了一个匿名函数,并且它接受参数
    mod
  2. 然后
    this.CodeMirror = mod();
    行接受
    mod
    并像方法一样调用它,这意味着程序员期望mod是一个函数。该方法的 RETURN 值被分配给 Window.CodeMirror 对象。自调用函数的
    this
    设置为
    Window
    对象。
  3. 匿名函数声明后的括号调用它,并且在这些括号中向函数传递参数。

总结:有15000行代码的函数的结果被分配给

Window.CodeMirror

© www.soinside.com 2019 - 2024. All rights reserved.