【问题标题】:var x = x || {}; vs. x = window.x || {};变量 x = x || {};与 x = window.x || {};
【发布时间】:2014-05-30 16:46:35
【问题描述】:

我正在编写一个脚本,以防止污染 DOM 的其余部分,它将是一个收集一些基本访问者分析数据的第 3 方脚本。

我通常使用类似的东西创建一个伪“命名空间”:var x = x || {};

我正在查看的其他一些人的代码使用:x = window.x || {};

我知道不设置var 会设置一个全局变量。这是唯一的区别吗?

我正在检查 Chrome 和 Webstrom 中的两个对象,它们看起来相同。

有人可以解释这两种方法之间的区别以及使用一种方法的含义(如果有的话)吗?

正如我所说,当我检查创建的对象时,它们看起来和我一模一样,但我从 JS 中学到了……外表可能具有欺骗性。

【问题讨论】:

  • 第二个对我来说似乎没有意义。你能在网上举个例子吗?
  • 如果你的代码要与node.js中的require.js/一起使用,你可能还需要考虑调用define或有条件地设置module.exports
  • 第一个在严格模式下工作,第二个不工作,因为不允许使用隐式全局变量 - 它们必须用 var 声明。
  • 我认为这主要是可读性的问题。我的偏好是使用window.x 而不是恰好位于全局空间中的var x。如果您将代码转换为模块模式(您应该),那么 window.x 已经是您想要的,而 var x 需要更改。
  • 如果您确定会有window 对象 - 我建议使用window.x。当您正在编写第 3 方脚本时 - 没有人可以保证它将在什么上下文中执行。应该是window.x = window.x || {}

标签: javascript object


【解决方案1】:

这两者并不完全相同,区别实际上并不在于使用window.x 读取变量,而是x 的创建方式。一个在严格模式下工作,另一个不工作。

对于第一个:

var x = x || {};

这与以下内容基本相同:

var x;
if (!x) x = {};

对于第二种方法:

x = window.x || {};

这与以下内容基本相同:

if (!window.x) x = {};

在第二个中,window.x 是必需的,而不仅仅是 x,因为以这种方式引用未定义的变量,而前面没有 window. 会导致错误。除此之外,另一个主要区别是第一个有:

var x;
x = {};

而且,第二个刚刚:

x = {};

第二个模型隐式创建了一个全局变量,而没有先声明它,这在严格模式下是不合法的。


因此,这里的主要功能区别不是通过window.x 读取,而是在不使用var 声明变量的情况下进行分配,并且在严格模式下运行时这种区别很显着。如果您希望您的代码在严格模式下工作,那么在这两个选项之间,您必须使用第一个选项,因为在严格模式下不允许隐式声明的全局变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2013-07-08
    • 2015-08-27
    • 1970-01-01
    相关资源
    最近更新 更多