JavaScript: 带参数的自执行函数
JavaScript: Self-executing function with parameter
CodeMirror.net 使用这个构造(我稍微简化了)来介绍其 JavaScript 编辑器的代码:
(function(mod) {
this.CodeMirror = mod();
})(function() {
"use strict";
(15,000-odd lines of advanced JS)
}
现在,我知道这是一个自执行函数,并且我已经阅读了很多关于它们的帖子。我知道,实际上,这段代码正在创建一个 CodeMirror 对象。我就是不懂机制。
- 参数(mod)的作用是什么?更广泛地说,当你给一个自执行函数一个参数时,这意味着什么?
- 内部 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)
}
该函数做它做的任何事情,并且(大概)returns 一个对象引用用作全局 CodeMirror
入口点。
因为第一个函数——立即调用的函数——在没有任何显式 this
值的情况下被调用,它期望 this
将被设置为全局上下文的值,或者 window
在浏览器中。我个人认为明确地这样做会更安全:
(function(mod) {
this.CodeMirror = mod();
}).call(this, function() {
"use strict";
(15,000-odd lines of advanced JS)
})
在全局词法上下文中,是保证this
将是对全局上下文的引用,"strict"模式与否。但是如果直接调用外部立即调用函数,那么 this
将在 "strict" 模式下变为 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
CodeMirror.net 使用这个构造(我稍微简化了)来介绍其 JavaScript 编辑器的代码:
(function(mod) {
this.CodeMirror = mod();
})(function() {
"use strict";
(15,000-odd lines of advanced JS)
}
现在,我知道这是一个自执行函数,并且我已经阅读了很多关于它们的帖子。我知道,实际上,这段代码正在创建一个 CodeMirror 对象。我就是不懂机制。
- 参数(mod)的作用是什么?更广泛地说,当你给一个自执行函数一个参数时,这意味着什么?
- 内部 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)
}
该函数做它做的任何事情,并且(大概)returns 一个对象引用用作全局 CodeMirror
入口点。
因为第一个函数——立即调用的函数——在没有任何显式 this
值的情况下被调用,它期望 this
将被设置为全局上下文的值,或者 window
在浏览器中。我个人认为明确地这样做会更安全:
(function(mod) {
this.CodeMirror = mod();
}).call(this, function() {
"use strict";
(15,000-odd lines of advanced JS)
})
在全局词法上下文中,是保证this
将是对全局上下文的引用,"strict"模式与否。但是如果直接调用外部立即调用函数,那么 this
将在 "strict" 模式下变为 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