JavaScript:带参数

时间:2015-09-12 16:13:28

标签: javascript codemirror self-executing-function

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

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

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

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

2 个答案:

答案 0 :(得分: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将被设置为全局上下文的值,或者{{1}在浏览器中。就个人而言,我认为明确地这样做会更安全:

window

在全局词汇上下文中, 保证(function(mod) { this.CodeMirror = mod(); }).call(this, function() { "use strict"; (15,000-odd lines of advanced JS) }) 将成为对全局上下文的引用," strict"模式与否。但是如果简单地调用那个外部立即调用的函数,那么this将是this在" strict"模式和初始化将失败。

答案 1 :(得分: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. 在匿名函数声明之后立即调用它,在这些括号中为函数传递一个参数。
  4. 摘要:将具有15000行代码的函数结果分配给Window.CodeMirror