JavaScript NameSpace 全局变量与全局变量 属性

JavaScript NameSpace Global Variable vs Global Property

关于在 JavaScript 中创建命名空间,我有两个部分的问题,以下其中一项是 proper/better 定义命名空间的方法:

// 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,我们将创建一个全局 属性,如此处所述

What is the purpose of the var keyword and when to use it (or omit it)?

有人可以向我解释一下为什么没有 var 键的样式 1 会失败吗?

非常感谢。

这是喜欢的问题,但我更喜欢第一个,因为它更短且更易读。

第一个样式'means':

创建局部变量'company'。如果它在上层范围内存在(并且它的值不是假的),则将其分配给此变量,否则分配一个新对象。

第二个'means'

如果未定义,则将新对象分配给公司变量,如果已定义,则分配给公司变量自身。

如果您删除 'var',第一个会触发 ReferenceError,因为第二个引用 (company = company) 不存在并且解释器不知道如何来处理那个。如果它存在,即使您删除 'var'.

它也会起作用

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