JavaScript: 带参数的自执行函数

JavaScript: Self-executing function with parameter

CodeMirror.net 使用这个构造(我稍微简化了)来介绍其 JavaScript 编辑器的代码:

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

现在,我知道这是一个自执行函数,并且我已经阅读了很多关于它们的帖子。我知道,实际上,这段代码正在创建一个 CodeMirror 对象。我就是不懂机制。

  1. 参数(mod)的作用是什么?更广泛地说,当你给一个自执行函数一个参数时,这意味着什么?
  2. 内部 function() 声明的作用是什么?这似乎在某种程度上与 mod 有关?

感谢您的帮助。

在您的代码中:

(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)
}

该函数做它做的任何事情,并且(大概)returns 一个对象引用用作全局 CodeMirror 入口点。

因为第一个函数——立即调用的函数——在没有任何显式 this 值的情况下被调用,它期望 this 将被设置为全局上下文的值,或者 window 在浏览器中。我个人认为明确地这样做会更安全:

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

在全局词法上下文中,保证this将是对全局上下文的引用,"strict"模式与否。但是如果直接调用外部立即调用函数,那么 this 将在 "strict" 模式下变为 undefined 并且初始化将失败。

(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