Я видел во многих исходных кодах:
var me = this;
специально в Ext-JS 4 (JS framework). Зачем это делать? Есть ли другая причина или вы просто хотите, чтобы переменную вызывали как "me" вместо "this"?
Спасибо.
Я видел во многих исходных кодах:
var me = this;
специально в Ext-JS 4 (JS framework). Зачем это делать? Есть ли другая причина или вы просто хотите, чтобы переменную вызывали как "me" вместо "this"?
Спасибо.
Обычно вы можете сохранить ссылку на this
внутри области, в которой this
ссылается на что-то другое (например, на функцию обратного вызова).
Рассмотрим этот пример, в котором функция обработчика событий клика имеет другой контекст, который вы можете ожидать (this
не относится к экземпляру MyClass
):
var MyClass = function (elem) {
this.elem = elem;
this.name = "James";
elem.addEventListener("click", function () {
alert(this.name); //oops
}, false);
};
Теперь рассмотрим этот пример, в котором мы храним ссылку на значение this
внутри функции конструктора и используем ее внутри функции обратного вызова:
var MyClass = function (elem) {
var me = this;
this.elem = elem;
this.name = "James";
elem.addEventListener("click", function () {
alert(me.name); //works!
}, false);
};
Функция обратного вызова может ссылаться на переменную, которая была объявлена во внешней функции, даже после того, как эта функция вернулась (конструктор MyClass
возвращает, как только он выполнил addEventListener
). Это демонстрация закрытия.
Хотя, конечно, закрытие является более очевидной причиной для этого, я просто хотел добавить, что другой причиной может быть уменьшение размера мини-версии файла javascript.
this
как ключевое слово не может быть переименовано в процессе минимизации файла, в то время как локальная переменная может. Другими словами, всякий раз, когда вы будете использовать это (4 символа), вместо него можно использовать локальную переменную 1 символ.
Рассмотрим следующую примерную функцию ExtJS Ext.data.Store
:
filterBy: function(fn, scope) {
var me = this;
me.snapshot = me.snapshot || me.data.clone();
me.data = me.queryBy(fn, scope || me);
me.fireEvent('datachanged', me);
me.fireEvent('refresh', me);
}
(обратите внимание, что здесь нет замыкания)
и его сокращенная версия:
filterBy:function(b,a){var c=this;c.snapshot=c.snapshot||c.data.clone();c.data=c.queryBy(b,a||c);c.fireEvent("datachanged",c);c.fireEvent("refresh",c)}
(151 символ/байты)
Теперь сравним его с мини-версией, если мы не назначили this
локальной переменной:
filterBy:function(b,a){this.snapshot=this.snapshot||this.data.clone();this.data=this.queryBy(b,a||this);this.fireEvent("datachanged",this);this.fireEvent("refresh",this)}
(170 символов/байт)
Как вы можете видеть, версия с локальной переменной принимает только 88% от размера функции, которая использует this
каждый раз вместо этого.
Особенно в больших библиотеках это может немного уменьшить размер файла.
В основном это использует закрытие в javascript. Прочитайте это о закрытии.
Он используется для переноса конкретного экземпляра this
для вызова функций, где this
имеет другое значение.
Настройка me=this
позволяет использовать переменную this
из внешней области во внутренней области.
var Outer= function () {
var me = this;
me.x = "outerx";
me.inner = {
x: "innerx",
displayValues: function () {
console.log(me.x); //outerx
console.log(this.x); //innerx
}
};
};
new Outer().inner.displayValues();