CodeMirror.net使用这个构造(我稍微简化)来为它的JavaScript编辑器引入代码:
(function(mod) {
this.CodeMirror = mod();
})(function() {
"use strict";
(15,000-odd lines of advanced JS)
}
现在,我知道这是一个自动执行的功能,我已经阅读了很多关于它们的帖子。据我所知,实际上,这段代码正在创建一个CodeMirror对象。我只是不懂机制。
感谢您的帮助。
答案 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)
})
这里没有发生任何奇怪或神奇的事情,以下是这个流程:
(function(mod) {
this.CodeMirror = mod();
})
这声明了一个匿名函数,它接受参数mod
。this.CodeMirror = mod();
接受mod
并像方法一样调用它,这意味着程序员期望mod成为一个函数。该方法的 RETURN 值分配给 Window.CodeMirror 对象。自调用函数将this
设置为Window
对象。 摘要:将具有15000行代码的函数结果分配给Window.CodeMirror