【问题标题】:Javascript property access without variable assignment or declaration: Why?没有变量赋值或声明的 Javascript 属性访问:为什么?
【发布时间】:2014-08-06 14:01:51
【问题描述】:

我继承了一个相当大的代码库,并且似乎有一些编码模式正在发生,但我终生无法看到它的作用。

本质上,该应用程序包含许多类,每个类都有一种强制单例的工厂函数。但是,似乎有一条多余的行,它只是访问对象属性而不将其分配给变量或设置属性。

例如:

myApp.dialog.AddEvent = Backbone.View.extend({
  initialize: function() { ... },
  render: function() { ... },
  refresh: function() { ... }
});

myApp.dialog._addEvent; // <-- What is this for?

myApp.dialog.addEvent = function() {
  var d = myApp.dialog._addEvent;
  if (!d) {
    d = myApp.dialog._addEvent = new myApp.dialog.AddEvent();
  }
  return d;
}

myApp.dialog._addEvent 行实际上做了什么,如果有的话?它在整个应用程序中出现的次数表明它不仅仅是一个错字。可能是旧 IE 的某种属性实例化 hack 或类似的东西?

【问题讨论】:

  • 你问的那一行没有做任何事情。它不会导致该属性被定义,如果该属性不存在,它不会导致错误。事实上,myApp.dialog 对象在该行之前或之后没有区别。
  • 谢谢,是的,我就是这么想的。我认为这可能是对没有赋值的等效变量声明的错误尝试(例如var addEvent;)。

标签: javascript properties singleton prototypal-inheritance


【解决方案1】:

这行代码:

myApp.dialog._addEvent;

什么都不做。它不会导致该属性被定义,如果该属性不存在,它不会导致错误。事实上,myApp.dialog 对象在该行之前或之后没有区别。

正如您推测的那样,作者可能认为有问题的行定义了对象上的属性(它没有),并且无论如何下面的代码都不需要预定义对象上的属性。

【讨论】:

  • 太好了,谢谢!现在我要删除一堆代码,这是我最喜欢的消遣之一。 :)
【解决方案2】:

没有看到myApp.dialog._addEvent 的来源,就不可能确切地说出发生了什么。通常,包含正在访问的变量的单行不会执行任何操作:

var a = {
    wat: 'wat'
};
a.wat; //this does nothing

但是,有可能为该属性编写了 accessor,这可能会导致副作用(或者您可能会看到 __defineGetter__Object.defineProperty)。

var a = {
    get wat() {
        console.log('wat!');
        return 'wat';
    }
};
a.wat; //this writes 'wat!' to the console

这种编程通常被认为是不好的做法,因为它违反了principle of least astonishment

也就是说,只是因为这是不好的做法并不意味着它没有发生。

【讨论】:

  • 我想你可以从后面的代码中看出,_addEvent 属性的预期数据是一个对象,而不是具有访问器的属性。
  • @jfriend00,我同意很有可能,但是有可能用访问器和突变器做一些非常疯狂的事情,所以值得一提的是其他可能性。
  • 是的,感谢您找到了该行“可能”正在做的事情,但我认为我们没有任何证据表明这就是这里实际发生的事情。
  • 有趣啊!我什至没有想到 ES5 访问器。但是,我搜索了整个代码库,myApp.dialog._addEvent 出现在该类之外的任何地方,所以它确实只是一个多余的行。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 2016-01-30
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多