我已经开始学习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 = {})是用于赋值还是或比较呢?或者在这种情况下,||是一个完全不同的操作?
发布于 2014-04-22 07:18:10
这是一个使用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];
}发布于 2014-04-22 07:18:32
什么行“this._events连着(this._events ={});”意味着?
逻辑OR执行第一个表达式this._events,如果falsy执行第二个表达式(this._events = {})。
本质上,它检查this._events是否是错误的,如果是的话,那么为它分配一个新的空对象。
这样,无论是什么,this._events总是至少是一个空对象,下面的代码将能够在没有问题的情况下执行。
发布于 2014-04-22 07:21:43
这是一种写作的方式
if (!this._events) {
this._events = {};
}在我看来,使用这种短手是不好的做法,我认为下面这句话
var events = this._events[name] || (this._events[name] = []);甚至更糟。混合作业,events和this._events[name]的创建是相当短的,但也很难读懂。如果你不知道你在做什么,你可能会以这种方式引入一些微妙的错误。这并不能超过这一切在一条线上的好处。
最终它还是会缩小的。让微型机把所有的东西都放在一条线上。不用自己动手。
https://stackoverflow.com/questions/23212926
复制相似问题