javascript命名空间全局变量与全局属性

JavaScript NameSpace Global Variable vs Global Property

关于在javascript中创建名称空间,我有两个部分的问题,以下哪一个是定义名称空间的正确/更好的方法:

1
2
3
4
5
6
7
8
9
// style 1
var company = company || {};
company.models = company.models || {};
company.models.class = {...}

// style 2
company = typeof (company) == 'undefined' ? {} : company;
company.models = company.models || {};
company.models.class = {...}

请注意,款式有两种不同。第一个是typeof的使用,第二个是样式2不使用var键。

这两种风格似乎都有效,而现在这正是它真正令人困惑的地方。如果我从样式1中删除var键,那么名称空间根本就不起作用。我觉得公司是没有定义的。我认为这与VaR创建全局变量有关,如果没有VaR,我们将创建一个全局属性,如本文所述。

var关键字的用途是什么?何时使用它(或忽略它)?

请给我解释一下没有var键的样式1为什么会失败?

非常感谢。


这是喜欢的问题,但我更喜欢第一个,因为它较短,可读性更强。

第一种风格的"意思"是:

创建局部变量"company"。如果它存在于一个上限范围内(并且它的值不是错误的),那么将它指定给这个变量,否则将成为一个新的对象。

第二个"意思"

如果新对象未定义,则将其赋给公司变量;如果新对象已定义,则将其赋给公司变量。

如果删除"var",则第一个引用将触发引用错误,因为第二个引用(company=company)不存在,而且解释器不知道如何处理该错误。如果它存在,即使删除"var",它也会工作。

第一种样式的另一个注意事项是,即使公司是一个错误的值,如0、null或"