代码之家  ›  专栏  ›  技术社区  ›  Jacques Gaudin

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

  •  35
  • Jacques Gaudin  · 技术社区  · 7 年前

    在我作为初学者努力编写干净的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 首先执行,使用 我的应用程序 在全球范围内(由于 var 一开始)。我的问题是,我想不出这个选项比选项1做得更多的情况。

    选项4 在我看来写得更好 window.myApplication || (myApplication = {}) 避免在以下情况引发错误 我的应用程序 不在全局范围内。

    选项5 正在排除false-y值,而不是 undefined 但这是个好主意吗?如果 我的应用程序 如果说是一个空字符串,那么其余的代码很可能会失败,不是吗?

    是否有人能够阐明不同选项之间的差异,特别是解释为什么选项3被描述为更全面?

    1 回复  |  直到 7 年前
        1
  •  53
  •   T.J. Crowder    7 年前

    如果文章声称选项3“更彻底”,那就错了。这条分配链的中间根本没有意义。

    是否有人能够阐明不同选项之间的差异,特别是解释为什么选项3被描述为更全面?

    首先,需要注意的是:在2018年,你可能不想使用任何一个。相反,通过各种模块定义语法之一使用适当的模块( AMD ,则, CommonJS ,则, RequireJS )使用相关工具,或通过ES2015+模块 import export (可能是相关工具,如 Babel 也许 Webpack Browserify ,尽管当前版本的Chrome、Safari和Edge本机支持模块,而Firefox目前在一个标志后面也支持模块)。

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

    事实并非如此。

    选项2 很好,但似乎缺少 var myApplication 事先或 if(!window.myApplication) 否则,如果 myApplication 条件不在全局范围内 if(!myApplication) 会出错,不是吗?

    对(假设生产发生在全局范围内。如果不在全局范围内,则有一个在范围内 我的应用程序 在当前范围链的任何位置,它都不会抛出,因为 我的应用程序 不会是未解析的符号。)

    选项3 我的理解是 myApplication = myApplication 首先执行,使用 我的应用程序 在全球范围内(由于 var 一开始)。我的问题是,我想不出这个选项比选项1做得更多的情况。

    不,如果你有

    var myApplication = myApplication = myApplication || {}
    

    这是事情发生的顺序:

    1. var myApplication 如果全局不存在,则创建全局;如果存在,则保持全局不变
    2. myApplication || {} 进行计算,并取 我的应用程序 (如果是真的)或 {} (如果没有);我们这样说吧 value1
    3. myApplication = value1 (中间的一个)执行,结果为 值1
    4. myApplication=值1 (左侧的一个)无正当理由再次执行

    选项4 在我看来写得更好 window.myApplication || (myApplication = {}) 避免在以下情况引发错误 我的应用程序 不在全局范围内。

    的确

    选项5 正在排除false-y值,而不是 undefined 但这是个好主意吗?如果 我的应用程序 如果说是一个空字符串,那么其余的代码很可能会失败,不是吗?