为什么var x = x = x || {}比var x = x ||更彻底 {}?

Jac*_*din 35 javascript namespaces

在我努力编写干净的Javascript代码作为初学者时,我最近在阅读本段时读到了关于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;

*/
Run Code Online (Sandbox Code Playgroud)

选项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 +模块,importexport(和可能是一个相关的工具,如巴别和或许的WebPackBrowserify,虽然当前本机版本的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)

这是事情发生的顺序:

  1. var myApplication 如果它还不存在则创建全局,如果它存在则保持不变
  2. myApplication || {}被评估并获取myApplication(如果它是真实的)或{}(如果不是); 我们称之为value1
  3. myApplication = value1 (执行中间的那个)执行,结果是 value1
  4. myApplication = value1 (左边的那个)没有充分的理由再次执行

window.myApplication || (myApplication = {})如果myApplication不在全球范围内,我眼中的选项4可以更好地编写以避免抛出错误.

确实.

选项5除了错误的y值以外,undefined但这是一个好主意吗?如果myApplication说是一个空字符串,其余代码可能会失败,不是吗?

是.