我正在查看Backbones v1.0.0源代码并发现一些有趣的内容。在Backbone.Events对象中,“ on ”方法似乎将变量链接到对象值:
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 [name] ”值,该值是现有数组或设置为空数组。奇怪的部分是将对象推入此数组的下一行。在推送之后,如果您现在检查“ this._events [name] ”的值,它现在在其数组的末尾具有该新对象。对我来说,看起来两者基本上是链接的;当你更新一个时,另一个也会更新。
我之前没有碰过这样的事情并且做一个简单的浏览器控制台测试确认了这种行为。您更新一个,另一个获得更新。它似乎只适用于作为数组的对象值。任何人都可以解释这里发生了什么?我有点困惑?
答案 0 :(得分:3)
在var events = this._events[name] || (this._events[name] = []);
行之后,events
变量和this._events[name]
都指向相同的数组。由于它们都指向同一个数组,无论你是events.push(...)
还是this._events[name].push(...)
都没关系,它会在一个数组上推送一个元素,而这两个元素都指向它们。
这与此完全相同:
var a = []; // Create an empty array, reference it from `a`
var b = a; // Now, `b` and `a` both point to the same array
a.push("foo"); // Put an entry in the array
console.log(a.length); // "1", unsurprisingly
console.log(b.length); // "1", because both `a` and `b` point to the same array
答案 1 :(得分:1)
您更新一个,另一个也获得更新。
你只有一个数组,而且它正在更新。
将变量视为“指针”,当它们将对象作为值时(是的,数组计为对象)。变量不是对象,它只是保存对该对象的引用。
这个代码段可以更简单地证明:
var a = [];
var b = a;
a.push('Hello!');
alert(b[0]); // Hello!
此处只有一个数组,a
和b
变量都指向同一个数组。您可以修改该数组,并且可以从指向该数组的任何变量中获取这些修改。
答案 2 :(得分:0)
实际上发生的事情是将事件初始化为数组的简单方法(如果它尚不存在)。事件是指向this._events[name]
的指针,var x = false || 2;
console.log(x);
x = 1 || 2;
console.log(x);
本身是指向数组的指针。如果数组不存在,则将其初始化为新数组。
试试这个:
{{1}}