我经常看到javascript代码中定义的全局对象充当命名空间。
var MyNS = {a: function() {}, ... };
但有时候,我看到人们忽略“var”关键字,如
MyNS = {a: function() {}, ...};
我相信在Web浏览器中如果不使用var定义变量,则将其放在window对象中,该对象充当全局命名空间。由于它不使用“var”来保存几个字节的文本,是否有理由将用于此特定用途?
答案 0 :(得分:8)
由于不使用“var”来保存几个字节的文本,是否有理由将此关键字用于此特定目的?
我建议您不要使用var
关键字,即使您使用的是全局代码。
这两种方式看似相似,但实际上它们并不相同,第一种是变量声明,全局代码上的变量对象,是Global对象本身,这就是全局变量可以作为全局对象(window.MyNS
)的属性访问的原因。
第二个是未声明的作业,如果在作用域链中找不到标识符,它会在全局对象上创建一个属性。
避免它的一个真正原因是,在Strict Mode下的语言新标准ECMAScript第5版中,对未声明标识符的赋值将导致ReferenceError
破坏您的代码。
两个示例之间还有另一个细微差别,变量实例化在全局对象上创建不可删除的属性:
var myVar = '';
delete window.myVar; // false
typeof window.myVar; // 'string'
虽然未申报的任务不是:
myProp = '';
delete window.myProp; // true
typeof window.myProp; // 'undefined'
推荐文章:
答案 1 :(得分:2)
使用var
定义当前范围中的局部变量。如果您处于全球范围内,它们实际上是等效的。 var
的使用更多的是可理解性和可维护性,因为意图是绝对清楚的。如果不初始化var
,则不太清楚。
在任何本地范围内,如果在范围链的某个位置初始化MyNS
,您将覆盖该局部变量而不是定义全局变量。
答案 2 :(得分:0)
我认为使用关键字很好,因为它会让你养成习惯,并且当你在函数体内忘记它时有助于防止令人讨厌的错误。如果一些全局代码发现自己迁移到函数中,那也很好。
但不,这不是绝对必要的。
编辑 - @eyelidlessness有一个非常好的观点,但如果你在全球范围内输入代码已经不是问题。
我见过的一种相当无懈可击的模式是使用以下内容初始化全局命名空间:
(function(window, undefined) {
var foo = { stuff: "in my namespace", ... };
window.foo = foo;
})(this);
在全局层面,this
将成为窗口对象(如果您在浏览器中;如果没有,那么它就是该上下文中的全局对象)。
答案 3 :(得分:-1)
他决定在初始化时使用评论,但没有var
。即使你不同意,他对权衡的分析也值得一读。