5

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

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

现在,我知道这是一个自执行功能,并且我已经阅读了许多关于它们的帖子。我知道,在实践中,这段代码正在创建一个 CodeMirror 对象。我只是不懂机械。

  1. 参数(mod)的作用是什么?更广泛地说,当您为自执行函数提供参数时,这意味着什么?
  2. 内部 function() 声明的作用是什么?看来这在某种程度上与mod有关?

谢谢你的帮助。

4

2 回答 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参数将是对某个其他函数的引用,因为它唯一要做的就是用它进行函数调用。

实际上,立即调用的函数是用一个函数作为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)
})

在全局词汇上下文中,保证将是对全局上下文的引用,无论是否为“严格”模式this但是如果只是简单地调用了外部立即调用的函数,那么thisundefined处于“严格”模式并且初始化将失败。

于 2015-09-12T16:19:22.180 回答
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设置为WindowObject。
  3. 在匿名函数声明之后的括号调用它,并且在这些括号中,一个函数被传递了一个参数。

摘要:具有15000行代码的函数的结果分配给Window.CodeMirror

于 2015-09-12T16:23:03.360 回答