【发布时间】:2012-06-14 15:02:13
【问题描述】:
你怎么称呼这些模式?它们之间有什么区别?你什么时候使用每个?还有其他类似的模式吗?
(function() {
console.log(this); // window
})();
(function x() {
console.log(this); // window
})();
var y = (function() {
console.log(this); // window
})();
var z = function() {
console.log(this); // window
}();
编辑:我刚刚发现了另外两种看似多余的方法,方法是命名最后两种情况中的函数...
var a = (function foo() {
console.log(this); // window
})();
var b = function bar() {
console.log(this);
}();
EDIT2:下面是@GraceShao 提供的另一种模式,它使函数可以在函数范围之外访问。
(x = function () {
console.log(this); // window
console.log(x); // function x() {}
})();
console.log(x); // function x() {}
// I played with this as well
// by naming the inside function
// and got the following:
(foo = function bar() {
console.log(this); // window
console.log(foo); // function bar() {}
console.log(bar); // function bar() {}
})();
console.log(foo); // function bar() {}
console.log(bar); // undefined
【问题讨论】:
-
它的“模式”被称为“自调用函数”或“自评估函数”。在这种情况下,它们在语义上都是相同的。但是,它们关联的“名称”和结果(如果有)的规则略有不同。通常,它们对于创建新的词法范围很有用。
-
在所有情况下,您都在创建一个函数并调用它。在某些情况下,您会将返回值分配给变量,而在其他情况下则不会。
-
我个人更喜欢 Ben Alman 的说法:Immediately-Invoked Function Expression (IIFE)
-
这里要注意的关键是函数不会自行执行。正如 Esailija 所说,递归是自执行函数的一个例子。在示例中,有些东西正在调用函数,但它不是函数本身。
标签: javascript function design-patterns