41

我在许多源代码中看到:

var me = this;

特别是在 Ext-JS 4(JS 框架)中。为什么要做这样的事情?是否有任何其他原因,或者您只是希望将变量称为“me”而不是“this”?

谢谢你。

4

4 回答 4

55

通常,您可以将引用保留在引用其他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)。这是一个闭包的演示。

于 2012-11-13T16:23:01.177 回答
5

虽然闭包当然是这样做的更明显的原因,但我只是想补充一点,另一个原因可能是减小 javascript 文件的缩小版本的大小。

thisas 在压缩文件的过程中不能重命名关键字,而局部变量可以。换句话说,只要您使用这个(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%。

尤其是在大型库中,这可以大大减少文件大小。

于 2014-01-31T17:06:04.890 回答
3

设置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();
于 2015-02-05T00:52:14.747 回答
1

基本上这利用了javascript中的闭包。阅读有关关闭的信息。

它用于携带具有不同含义的this函数调用的特定实例。this

于 2012-11-13T16:23:52.877 回答