我在许多源代码中看到:
var me = this;
特别是在 Ext-JS 4(JS 框架)中。为什么要做这样的事情?是否有任何其他原因,或者您只是希望将变量称为“me”而不是“this”?
谢谢你。
我在许多源代码中看到:
var me = this;
特别是在 Ext-JS 4(JS 框架)中。为什么要做这样的事情?是否有任何其他原因,或者您只是希望将变量称为“me”而不是“this”?
谢谢你。
通常,您可以将引用保留在引用其他this
内容的范围内this
(例如,回调函数)。
考虑这个示例,其中 click 事件处理函数具有与您可能期望的不同的上下文(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
as 在压缩文件的过程中不能重命名关键字,而局部变量可以。换句话说,只要您使用这个(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 个字符/字节)
如您所见,带有局部变量的版本只占用了this
每次使用的函数大小的 88%。
尤其是在大型库中,这可以大大减少文件大小。
设置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();
基本上这利用了javascript中的闭包。阅读有关关闭的信息。
它用于携带具有不同含义的this
函数调用的特定实例。this