什么是“this._events ||(this._events = {});”意思?

时间:2014-04-22 07:13:54

标签: javascript backbone.js

我已经开始学习Backbone.js了。目前我的JavaScript技能不太好。我已经开始检查backbone.js文件并遇到了一行奇怪的代码,其目的我无法理解。代码示例(如果您需要更多上下文,请为开发人员手动下载backbone.js并查看第80行):

var Events = Backbone.Events = {

  // Bind an event to a `callback` function. Passing `"all"` will bind
  // the callback to all events fired.
  on: function(name, callback, context) {
    if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
    this._events || (this._events = {});
    var events = this._events[name] || (this._events[name] = []);
    events.push({callback: callback, context: context, ctx: context || this});
    return this;
  },

this._events || (this._events = {});行是什么意思?对我来说,_events看起来像是一个内部变量,但(this._events = {})用于分配,还是比较?或者||在这种情况下是一个完全不同的操作?

3 个答案:

答案 0 :(得分:5)

这是一个使用javascripts" falsy"评价。它与:

相同
if (this._events) {
    // do nothing, this._events is already defined
} else {
    this._events = {};
}

可以转换为

的行var events = this._events[name] || (this._events[name] = []);也是如此
var events;
if (this._events[name]) {
    events = this._events[name];
} else {
    this._events[name] = [];
    events = this._events[name];
}

答案 1 :(得分:1)

  

什么行“this._events || (this._events = {});“是指?

logical OR(||)执行第一个表达式this._events,如果falsy执行第二个表达式(this._events = {})

本质上,它会检查this._events是否为假,如果是,则为其分配一个新的空对象。

不管怎样this._events总是至少是一个空对象而且下面的代码能够毫无问题地执行。

答案 2 :(得分:1)

这是一种写作方式

if (!this._events) {
    this._events = {};
}

在我看来,使用那种简短的手是不好的做法,我想以下一行

var events = this._events[name] || (this._events[name] = []);

更糟糕。 eventsthis._events[name]的创建混合分配很短,但也很难阅读。如果你不知道你在做什么,你可能会以这种方式引入微妙的错误。这并没有超过将所有这一切放在一条线上的好处。

最后它无论如何都会被缩小。让minifiers在一条线上处理所有东西。不需要自己动手。