var me = this的值是多少;

Hem*_*ock 31 javascript extjs

我在ExtJS源代码中找到了这种模式.

method: function() {
  var me = this;
  ...
  me.someOtherMethod();
}
Run Code Online (Sandbox Code Playgroud)

他们为什么不使用this总是经常定义me(在不必输入2个字符之外)是否有一些优势?我可以理解他们是否试图通过闭包来维护上下文,但它是在没有闭包的地方完成的.

Ext.panel.Panel的一个例子:

disable: function(silent) {
    var me = this;

    if (me.rendered) {
        me.el.addCls(me.disabledCls);
        me.el.dom.disabled = true;
        me.onDisable();
    }

    me.disabled = true;

    if (silent !== true) {
        me.fireEvent('disable', me);
    }

    return me;
},
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 38

如果你的库在没有嵌入式闭包/回调可能有自己值的地方这样做this,那么这只是他们决定在他们的方法中遵循的"练习"或"风格"或"约定".总是没有编程理由.

在您已经添加到您的问题的特定编码示例中,除了常见的编码风格之外,我没有理由知道.此代码将在略小的代码中生成相同的结果:

disable: function(silent) {

    if (this.rendered) {
        this.el.addCls(this.disabledCls);
        this.el.dom.disabled = true;
        this.onDisable();
    }

    this.disabled = true;

    if (silent !== true) {
        this.fireEvent('disable', this);
    }

    return this;
},
Run Code Online (Sandbox Code Playgroud)

当涉及回调或闭包时,这通常是因为在方法内部仍然需要引用的this回调,但是那些回调将具有它们自己的值,this因此分配:

var me = this;
Run Code Online (Sandbox Code Playgroud)

或者更常见于我见过的其他代码:

var self = this;
Run Code Online (Sandbox Code Playgroud)

是一种保留对该对象的访问权限的方法,即使在具有不同值的回调中也是如此this.

这是一个通用的例子:

document.getElementById("myButton").onclick = function () {
    var self = this;       // save reference to button object use later
    setTimeout(function() {
        // "this" is not set to the button inside this callback function (it's set to window)
        // but, we can access "self" here 
        self.style.display = "none";    // make button disappear 2 seconds after it was clicked
    }, 2000);
};
Run Code Online (Sandbox Code Playgroud)

  • 这也是我的想法,但是OP自己做了这个观察,通常的做法是在回调中访问`this`.从我的阅读中,他特别询问为什么在没有新的背景时也使用它. (5认同)
  • 没有_programming_原因 - 它是为缩小文件大小而完成的."这个"不能缩短,而"我"可以. (4认同)
  • @jfriend00,我不是在提供我的意见.我正在陈述_exactly_为什么这是在Ext中完成的. (3认同)

Dan*_*ite 24

一个原因是因为缩小,me可以变得比短this.

  • 当你缩小代码时,我可以变成'x'或'y'或比'this'更短的东西.Minifiers不会修改'this'关键字. (5认同)
  • 这确实听起来像一个可能的好处.使用12个字符来声明最小化版本`var a = this; \n`和使用`a`而不是`this`节省3个char,如果有超过四个对`this`的引用,则可以节省字节.如果只有一个或两个引用`this`,你将丢失几个字节.我确实想知道这是否是真正的动机,或者它是否真的只是一种常见的方法实现方式,以保持所有方法的一致性,即使是嵌入式闭包的方法. (5认同)

jfr*_*d00 14

除了风格的原因和缩小的原因,我决定看看性能,看看是否thisself为任何更快.我创建了这个jsperf测试.

我可以说,在我尝试过的任何现代浏览器中,甚至IE6使用this与使用self或等局部变量之间的性能基本没有区别me.Chrome的速度要快得多,self而其他人的距离太近了.我认为我们可以排除任何性能原因.这是我看到的结果的屏幕截图:

在此输入图像描述