2013-03-29 4 views
1

Я смотрел исходный код Backbones v1.0.0 и заметил что-то интересное. В Backbone.Events объект метод «на», кажется, связывая переменной со значением объекта:Связывание переменных javascript с объектами.

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]», теперь у него есть этот новый объект в конце его массива. Для меня это похоже, что два по существу связаны с ; когда вы обновляете один, другой тоже обновляется.

Я раньше не сталкивался с чем-то подобным, и простую проверку на консоль браузера подтверждает это поведение. Вы обновляете один, а другой получает обновление. Однако, похоже, это работает только с объектными значениями, которые являются массивами. Может ли кто-нибудь объяснить, что здесь происходит? Я немного смущен?

ответ

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 
0

На самом деле то, что происходит это простой способ для инициализации событий в массив, если он уже не существует. События - это указатель, указывающий на this._events[name], который сам является указателем, указывающим на массив. Если массив не существует, он инициализируется новым массивом.

Попробуйте это:

var x = false || 2; 
console.log(x); 
x = 1 || 2; 
console.log(x); 
1

Вы обновляете, а другой получает обновление тоже.

У вас есть только один массив, и он обновляется.

Подумайте о переменных как «указатели», когда они имеют объект как значение (да, массив считается объектом). Переменная не является объектом, она просто содержит ссылку на этот объект.

Это может быть продемонстрировано более просто этого сниппета:

У вас есть только один массив здесь, и оба a и b переменные указывают на тот же массив. Вы изменяете этот массив, и эти изменения могут быть получены из любой переменной, указывающей на этот массив.

Смежные вопросы