我已经开始学习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 = {})
用于分配,还是或比较?或者||
在这种情况下是一个完全不同的操作?
答案 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] = []);
更糟糕。
events
与this._events[name]
的创建混合分配很短,但也很难阅读。如果你不知道你在做什么,你可能会以这种方式引入微妙的错误。这并没有超过将所有这一切放在一条线上的好处。
最后它无论如何都会被缩小。让minifiers在一条线上处理所有东西。不需要自己动手。