Javascript var x=x |{};vs.x=window.x |{};

Javascript var x=x |{};vs.x=window.x |{};,javascript,object,Javascript,Object,我正在编写一个脚本,我希望它不会污染DOM的其余部分,它将是一个第三方脚本,用于收集一些基本的访问者分析数据 我通常使用如下方式创建一个伪“名称空间”:var x=x | |{} 我正在研究的一些其他民族代码的用法:x=window.x |{} 我知道不设置var将设置一个全局var。这是唯一的区别吗 我正在检查Chrome和Webstrom中的两个对象,它们看起来一模一样 有人能解释这两种方法之间的区别以及使用一种方法而不是另一种方法的含义(如果有) 正如我所说,当我检查创建的对象时,它们看起

我正在编写一个脚本,我希望它不会污染DOM的其余部分,它将是一个第三方脚本,用于收集一些基本的访问者分析数据

我通常使用如下方式创建一个伪“名称空间”:
var x=x | |{}

我正在研究的一些其他民族代码的用法:
x=window.x |{}

我知道不设置
var
将设置一个全局var。这是唯一的区别吗

我正在检查Chrome和Webstrom中的两个对象,它们看起来一模一样

有人能解释这两种方法之间的区别以及使用一种方法而不是另一种方法的含义(如果有)


正如我所说,当我检查创建的对象时,它们看起来和我一样,但我已经学会了JS。。。外观可能具有欺骗性。

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

对于第一个:

var x = x || {};
这基本上与:

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

对于第二种方法:

x = window.x || {};
这基本上与:

var x;
if (!x) x = {};
if (!window.x) x = {};
在第二种情况下,需要使用
window.x
,而不仅仅是
x
,因为在不使用
窗口的情况下以这种方式引用未定义的变量。
在它前面会导致错误。除此之外,另一个主要区别是第一个有:

var x;
x = {};
第二个问题是:

x = {};
第二个模型隐式地创建一个全局变量,而不首先声明它,这在严格模式下是不合法的



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

第二个选项对我来说似乎没有意义。你可以在网上指点一个例子吗?如果你的代码将与Real.js/in NoDE.js一起使用,你也可以考虑调用<代码>定义< /代码>或设置<代码>模块。第二个不允许,因为不允许隐式全局变量-它们必须用
var
声明。我认为这主要是可读性问题。我更喜欢使用
window.x
而不是恰好在全局空间中的
var x
。如果您将代码转换为模块模式(应该),则
window.x
已经是您想要的,而
var x
需要更改。如果您确定将有
window
对象,我建议使用
window.x
。在编写第三方脚本时,没有人能保证它将在什么上下文中执行。它应该是
window.x=window.x |{}