以下两个块有什么区别?
// block 1
{
console.log("anonymous block");
}
// block 2
(function anon() {
console.log("anonymous block 2");
})();
我在 Netbeans 中运行了这个(使用 node.js 插件),它们似乎都可以工作......
以下两个块有什么区别?
// block 1
{
console.log("anonymous block");
}
// block 2
(function anon() {
console.log("anonymous block 2");
})();
我在 Netbeans 中运行了这个(使用 node.js 插件),它们似乎都可以工作......
不同之处在于您可以使用后一种形式隐藏全局变量而不破坏它们。
例如,假设您正在使用 jQuery 库,默认情况下,它的主命名空间别名为$
. 如果您想在$
不改变$
通常使用方式的情况下用于不同的目的,您可以执行以下操作:
(function($) {
// Use $ without clashing with the jQuery object.
})(someObject);
事实上,它也可用于另一个目的。由于undefined
它不是 JavaScript 中的保留字,因此它可以被赋予一个值而失去其用途。因此,您可以简单地不将值传递给undefined
参数,并且您知道它会正常运行而不会与全局值发生冲突。
undefined = "some not-undefined value"; // you'd have to be an idiot to do this but I've seen it done
(function(a, b, undefined) {
console.log(typeof(undefined) === "undefined"); // true
})(someA, someB);
第一个创建一个块,它与一个函数不同。您可以使用匿名自执行函数来创建本地私有变量并从中返回接口。它被称为模块模式。
var Module = (function() {
var method = function() { console.log("anonymous block"); },
someOtherMethod = function() {};
return { // return our interface as an object literal
method: method,
someOtherMethod: someOtherMethod
};
})();
Module.method(); // "anonymous block"
我们可以调用它,保留变量method
并someOtherMethod
与全局范围隔离。它是 JS 中面向对象编程的最重要、最有用的特性之一。
block 1
将具有其所在块的范围,设置 var 将在父级中覆盖它,您可以使用let
.
var a = 2;
{
var a = 4;
}
a; // === 4
block 2
将具有全局范围,但设置的任何内容var
在执行后都会被遗忘。
var a = 2;
(function(){
var a = 4;
})();
a; // === 2