【发布时间】:2018-09-25 21:35:11
【问题描述】:
在我作为初学者编写干净的 Javascript 代码的过程中,我最近在阅读 this article 关于 JavaScript 中的命名空间时偶然发现了这一段:
下一个示例顶部的代码演示了在定义变量(对象命名空间)之前检查变量(对象命名空间)是否已经存在的不同方法。您通常会看到开发人员使用选项 1,但选项 3 和 5 可能被认为更彻底,选项 4 被认为是一个很好的最佳实践。
// This doesn't check for existence of 'myApplication' in // the global namespace. Bad practice as you can easily // clobber an existing variable/namespace with the same name var myApplication = {}; /* The following options *do* check for variable/namespace existence. If already defined, we use that instance, otherwise we assign a new object literal to myApplication. Option 1: var myApplication = myApplication || {}; Option 2 if(!MyApplication) MyApplication = {}; Option 3: var myApplication = myApplication = myApplication || {} Option 4: myApplication || (myApplication = {}); Option 5: var myApplication = myApplication === undefined ? {} : myApplication; */
选项1肯定是我见过用的最多的一个,我也很理解。
选项 2 很好,但似乎缺少 var myApplication 或 if(!window.myApplication) 否则如果 myApplication 不在全局范围内,则条件 if(!myApplication) 会抛出错误,不会不是吗?
选项 3 是我遇到的问题:我的理解是首先执行 myApplication = myApplication,myApplication 在全局范围内(由于开头的 var )。我的问题是我想不出这个选项比选项 1 做更多的事情。
选项 4 在我看来最好写成 window.myApplication || (myApplication = {}) 以避免在 myApplication 不在全局范围内时引发错误。
选项 5 排除了 undefined 以外的 false-y 值,但这是个好主意吗?如果myApplication 是一个空字符串,那么剩下的代码很可能会失败,不是吗?
是否有人能够阐明不同选项之间的差异,并特别解释为什么选项 3 被描述为更彻底?
【问题讨论】:
-
我想部分答案取决于
'use strict'的废弃。当你说选项 1 会抛出错误,因为中间声明没有var,只有当你使用'use strict'时才会这样。 -
@trysis 选项 1 没问题,你的意思是选项 3?我不明白...
-
@trysis:严格模式对列出的任何选项都没有影响。最接近的相关更改严格模式是分配给未声明的标识符成为错误,而不是我所说的the Horror of Implicit Globals。但以上所有内容要么声明标识符 (1, 3, 5),要么尝试在分配给它 (2, 4) 之前评估可能未声明的标识符,如果标识符将失败未声明,即使在松散模式下也是如此。 (如果使用
typeof,选项 2 将与严格模式相关,但它没有。) -
您为什么要这样做?如果我是你,我会完全放弃
var和全局属性,我会转移到let和模块。 -
@m93a 关键是要了解我读到的内容,我知道模块是当今的发展方向,但学习语言的基础知识是我目前所处的位置:-)
标签: javascript namespaces