这两种JavaScript模式中的哪一种更适合实例化一个对象?

时间:2017-02-01 04:59:33

标签: javascript

  1. 以下任何一种模式是否有任何优势,或者它们是完全相同的,但有一种只是使用if else简写?

    if ((typeof ShopScript) === 'undefined') { ShopScript = {}; }
    

    还是这个?

    window.ShopScript = window.ShopScript || {};
    
  2. 我对window.ShopScript感到好奇......在任何一种情况下,ShopScript对象是否附加到窗口(甚至可能是其他合理的东西)?

  3. 这些常见或已知的模式是否有命名可以引用它们?也就是说,如果我试着将这篇文章的标题问题改写为"模式A和B之间有什么区别," A和B会是什么?

1 个答案:

答案 0 :(得分:1)

第一个代码段未声明ShopScript,这不是一件好事。如果您在全球范围内,则可以使用var

执行此操作
if (typeof ShopScript === 'undefined') {
    var ShopScript = {};
}

但是由于var没有块范围(这就是在这里使用它的重点),所以不需要使用typeof来检查不确定性:

var ShopScript;

if (ShopScript === undefined) {
    ShopScript = {};
}

如果您不在全局范围内,那么您需要以某种方式引用全局对象以向其添加属性(window,例如,在浏览器中):

if (typeof ShopScript === 'undefined') {
    window.ShopScript = {};
}

但在那时你也可以用它来检查;这里真的没什么区别:

if (window.ShopScript === undefined) {
    window.ShopScript = {};
}

这也是你使用||获得第二个代码段的方式,如果window.ShopScript是假的,而不是特别是undefined,那么测试除外。对于添加全局“命名空间”对象的情况,这很少重要。

回答(2),是的,在严格模式之外分配一个未声明的变量会将它放在全局对象上。在严格模式下,它会抛出错误,您应该使用严格模式。

*它还无条件地重新分配ShopScript,如果ShopScript被定义为具有自定义描述符的属性,则仅具有可见效果。这种情况也很少发生。