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

JavaScript命名空间全局变量与全局属性,javascript,namespaces,global-variables,Javascript,Namespaces,Global Variables,关于在JavaScript中创建名称空间,我有两个问题,以下哪一个是定义名称空间的正确/更好的方法: // style 1 var company = company || {}; company.models = company.models || {}; company.models.class = {...} // style 2 company = typeof (company) == 'undefined' ? {} : company; company.models = com

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

// 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的使用,第二个是style 2没有使用var键

这两种风格似乎都很管用,而现在却让人很困惑。如果我从样式1中删除var键,则名称空间根本不起作用。我觉得公司没有定义。我认为这和var有关,它创建了一个全局变量,没有var,我们创建了一个全局属性,如这里所解释的

请解释一下为什么样式1在没有var键的情况下会失败


非常感谢

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

第一种风格的“意思”:

创建局部变量“company”。如果它存在(并且它的值不是falsy),则将其指定给该变量,否则将指定一个新对象

第二个“意思”

如果公司变量未定义,则为其分配一个新对象;如果公司变量已定义,则为其自身分配一个新对象

如果由于第二个引用(company=company)不存在且解释器不知道如何处理而删除“var”,则第一个引用会触发ReferenceError。如果它存在,即使您删除“var”,它也会工作


第一种样式的另一个注意事项是,公司将被一个新对象覆盖,即使它是一个虚假的值,如0、null或“

也许您在范围中的某个地方启用了“use strict”?这将不允许创建全局变量/属性。