CodeMirror.net 使用此构造(我稍微简化了)来引入其 JavaScript 编辑器的代码:
(function (mod) {
this.CodeMirror = mod();
})(function () {
"use strict";
/* 15,000-odd lines of advanced JS */
})
现在,我明白这是一个 IIFE,并且我已经阅读了很多关于它们的帖子。 据我了解,实际上,这段代码正在创建一个 CodeMirror 对象。 我只是不明白其中的机制。
mod
的作用是什么? 更广泛地说,当您向 IIFE 提供参数时,这意味着什么?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)
}
该函数会执行它所做的任何事情,并且(大概)返回一个对象引用以用作全局
CodeMirror
入口点。
因为第一个函数(即立即调用的函数)是在没有任何显式
this
值的情况下调用的,因此它期望将 this
设置为全局上下文的值,或者在浏览器中设置为 window
的值。我个人认为明确地这样做会更安全:
(function(mod) {
this.CodeMirror = mod();
}).call(this, function() {
"use strict";
(15,000-odd lines of advanced JS)
})
在全局词法上下文中,is保证
this
将是对全局上下文的引用,无论是否是“严格”模式。但如果简单地调用外部立即调用的函数,那么在“严格”模式下 this
将是 undefined
并且初始化将会失败。
(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