JavaScript:带参数的自执行功能

Ang*_*bie 4 javascript codemirror self-executing-function

CodeMirror.net使用这个构造(我稍微简化)来为它的JavaScript编辑器引入代码:

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

现在,我知道这是一个自动执行的功能,我已经阅读了很多关于它们的帖子.据我所知,实际上,这段代码正在创建一个CodeMirror对象.我只是不懂机制.

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

谢谢你的帮助.

Poi*_*nty 5

在你的代码中:

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

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

function something(mod) {
    this.CodeMirror = mod();
}
Run Code Online (Sandbox Code Playgroud)

该函数显然希望mod参数将是对其他函数的引用,因为它唯一能做的就是用函数调用它.

事实上,使用函数调用立即调用的函数作为mod参数的值:具体来说,这个:

function() {
  "use strict";
   (15,000-odd lines of advanced JS)
}
Run Code Online (Sandbox Code Playgroud)

该函数执行它所做的任何事情,并且(可能)返回一个对象引用以用作全局CodeMirror入口点.

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

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

在全球范围内的词汇,它保证this将在全球范围内,"严"模式或不是一个引用.但是如果简单地调用外部立即调用的函数,那么thisundefined处于"严格"模式并且初始化将失败.