通常,我看到JavaScript代码中定义的全局对象充当命名空间。

var MyNS = {a: function() {}, ... };

但是有时候,我看到人们离开了“ var”关键字

MyNS = {a: function() {}, ...};

我相信在Web浏览器中,如果您不定义带有VAR的变量,则将其放在窗口对象中,该对象充当全局名称空间。由于它通过不使用“ var”来节省几个字节文本,这是有理由使用关键字的 出于这个特定目的 ?

有帮助吗?

解决方案

由于它通过不使用“ var”来节省几个字节文本,是否有理由将关键字用于此特定目的?

我不建议您避免 var 关键字,即使您使用的是全局代码。

两种方式看起来相似,但实际上它们不一样,第一个是 可变声明, , 这 可变对象 在全局代码上,是全局对象本身,这就是为什么全局变量可以作为全局对象的属性访问的原因(window.MyNS).

第二个是 未申报的作业, ,如果在示波器链中找不到标识符,它将在全局对象上创建属性。

避免这种情况的一个真正原因是,在语言的新标准中 严格模式, ,对未申报的标识符的任务将抛出 ReferenceError 打破代码。

您的两个示例之间还有另一个微妙的区别,可变实例化在全局对象上创建属性,而不是删除:

var myVar = '';
delete window.myVar; // false
typeof window.myVar; // 'string'

虽然未申报的作业并未:

myProp = '';
delete window.myProp; // true
typeof window.myProp; // 'undefined'

推荐文章:

其他提示

指某东西的用途 var 定义当前范围中的局部变量。如果您处于全球范围,则有效地等效。指某东西的用途 var 有更多的可理解性和可维护性,因为意图是绝对明确的。不明确而不初始化 var.

在任何本地范围中,如果 MyNS 在范围链的某个地方初始化,您将覆盖该本地变量,而不是定义全局变量。

我认为使用关键字很不错,因为它可以使您习惯,并在您在功能体内忘记它时有助于防止讨厌的错误。如果某些全局代码发现自己迁移到函数中,这也很好。

但是不,这不是严格必要的。

编辑 - @eyelidless具有非常好的点,尽管如果您在全球级别上打字代码已经不是问题。

我看到的一个相当防弹的模式是用这样的东西初始化全局名称空间:

(function(window, undefined) {

  var foo = { stuff: "in my namespace", ... };

  window.foo = foo;
})(this);

在全球层面, this 将是窗口对象(如果您在浏览器中;如果不是浏览器,则是该上下文中的全局对象)。

道格拉斯·克罗克福德(Douglas Crockford)在这个确切的问题上:http://www.yuiblog.com/blog/2008/04/16/global-domination-part-two/

他定居在初始化中使用评论,但没有 var. 。即使您不同意,他对权衡的分析也值得阅读。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top