Jac*_*din 35 javascript namespaces
在我努力编写干净的Javascript代码作为初学者时,我最近在阅读本段时读到了关于JavaScript中的命名空间的文章:
下一个示例最顶部的代码演示了在定义变量(对象命名空间)之前可以检查变量(对象命名空间)的不同方式.您通常会看到使用选项1的开发人员,但选项3和5可能被认为是更彻底的,选项4被认为是一个很好的最佳实践.
Run Code Online (Sandbox Code Playgroud)// 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之外还做什么的情况.
window.myApplication || (myApplication = {})如果myApplication不在全球范围内,我眼中的选项4可以更好地编写以避免抛出错误.
选项5除了错误的y值以外,undefined但这是一个好主意吗?如果myApplication说是一个空字符串,其余代码可能会失败,不是吗?
是否有人能够阐明不同选项之间的差异,特别是解释为什么选项3被描述为更彻底?
T.J*_*der 54
如果文章声称选项3"更彻底",则它是不正确的.根本没有指向任务链的中间部分.
是否有人能够阐明不同选项之间的差异,特别是解释为什么选项3被描述为更彻底?
首先,需要注意的是:在2018年,您可能不想使用其中任何一种.相反,使用适当的模块,或者通过各种模块定义语法(之一AMD,CommonJS的,RequireJS)带相应的刀,或经由ES2015 +模块,import和export(和可能是一个相关的工具,如巴别和或许的WebPack或Browserify,虽然当前本机版本的Chrome,Safari和Edge支持模块,Firefox目前也支持旗帜).
为什么
var x = x = x || {}比这更彻底var x = x || {}?
事实并非如此.
选项2很好,但似乎缺少
var myApplication事先或if(!window.myApplication)否则如果myApplication不在全局范围内,条件if(!myApplication)会抛出错误,不是吗?
是.(假设生产发生在全局范围.如果它不在全局范围内,并且myApplication当前范围链中的任何位置都有范围内,它将不会抛出,因为它不是myApplication未解析的符号.)
选项3是我遇到的问题:我的理解是
myApplication = myApplication首先执行,myApplication在全局范围内(由于var在开始时).我的问题是我无法想到这个选项除了选项1之外还做什么的情况.
不,如果你有
var myApplication = myApplication = myApplication || {}
Run Code Online (Sandbox Code Playgroud)
这是事情发生的顺序:
var myApplication 如果它还不存在则创建全局,如果它存在则保持不变myApplication || {}被评估并获取myApplication(如果它是真实的)或{}(如果不是); 我们称之为value1myApplication = value1 (执行中间的那个)执行,结果是 value1myApplication = value1 (左边的那个)没有充分的理由再次执行
window.myApplication || (myApplication = {})如果myApplication不在全球范围内,我眼中的选项4可以更好地编写以避免抛出错误.
确实.
选项5除了错误的y值以外,
undefined但这是一个好主意吗?如果myApplication说是一个空字符串,其余代码可能会失败,不是吗?
是.
| 归档时间: |
|
| 查看次数: |
5078 次 |
| 最近记录: |