什么是以下两个块之间的差异?
// 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