var me = this的值是多少;

时间:2011-09-15 19:53:58

标签: javascript extjs

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

method: function() {
  var me = this;
  ...
  me.someOtherMethod();
}

他们为什么不只使用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;
},

10 个答案:

答案 0 :(得分: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;
},

当涉及回调或闭包时,通常会这样做,因为在方法中使用了回调,他们仍然希望引用this,但这些回调将具有自己的值{{1}分配:

this

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

var me = this;

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

这是一个通用的例子:

this

答案 1 :(得分:24)

一个原因是因为缩小,me可能会比this短得多。

答案 2 :(得分:14)

除了样式原因和缩小原因外,我决定查看效果,看看thisself是否更快。我创建了这个jsperf test

我可以说,在我使用this使用self或{{{{}}}这样的局部变量时,我尝试过的任何现代浏览器甚至IE6的性能基本没有差异。 1}}。使用me时,Chrome的速度会稍微快一点,其他人的距离太近了。我认为我们可以排除任何性能原因。这是我看到的结果的屏幕截图:

enter image description here

答案 3 :(得分:4)

问题很可能与闭包函数有关,例如在注册回调时作为参数。在这种情况下,“this”可以具有完全不同的值,因此他们需要使用“me”。

答案 4 :(得分:4)

有时候在闭包中保持范围,但主要是(如在发布的示例中)允许缩小,因为me可以缩小到一个字符,而this不能更改。在给定函数中大约3或4次this用法之后,这变得很重要(少于那个,你实际上可能会从额外的声明代码中得到一些额外的字节)。就这么简单 - 它与编程风格或奇思妙想无关。

答案 5 :(得分:2)

基于您刚刚添加的Ext.panel.Panel示例,除非我对Javascript变量的理解非常错误,否则不在此处进行分配将对代码的作用完全没有影响。

唯一的可能性是风格。

虽然我会将其视为过度工程,但如果您想要在此上下文中添加需要访问this的回调,那么您将不需要返回更改所有内容thisme的{​​{1}}。毕竟,输入:s/很难。

答案 6 :(得分:2)

实际上,虽然这可能不是动机,但为风格做这件事是有道理的。许多样式约定都会让忘记某些内容变得更加困难,例如总是将{}放在else块周围,即使它是单个语句。重新分配“this”会产生类似的影响,因为开始JavaScript程序员会使闭包“只是工作”的时间比例更高。

答案 7 :(得分:1)

除了维护用于闭包的上下文之外,我不知道使用该模式有任何程序上的差异。也许这只是ExtJS正在使用的惯例。

此外,正如丹尼尔所指出的那样,可能会在缩小时进一步缩短代码。 ExtJS,jQuery等库很关心文件大小,使用这种技术可以节省足够的文件大小

e.g。 1000'this',假设1 char = 1字节,是4kb。使用上述技术可能会削减2或3 kb。

更新:继续前进并做了一个小实验..

var test = {
  a : function() {
     this.x='';
     this.x='';
     this.x='';
      this.x='';
     this.x='';
     this.x='';
     this.x='';
     this.x='';
     this.x='';
      this.x='';
     this.x='';
     this.x='';
  },
  b : function() {
      this.x='';
     this.x='';
     this.x='';
      this.x='';
     this.x='';
     this.x='';
     this.x='';
     this.x='';
     this.x='';
      this.x='';
     this.x='';
     this.x='';
  },
  c : function() {
      this.x='';
     this.x='';
     this.x='';
      this.x='';
     this.x='';
     this.x='';
     this.x='';
     this.x='';
     this.x='';
      this.x='';
     this.x='';
     this.x='';
  }
}

缩小为

var test={a:function(){this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x=""},b:function(){this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x=""},c:function(){this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x=""}}

,而

var test = {
  a : function() {
     var me=this;
     me.x='';
     me.x='';
     me.x='';
      me.x='';
     me.x='';
     me.x='';
     me.x='';
     me.x='';
     me.x='';
      me.x='';
     me.x='';
     me.x='';
  },
  b : function() {
      var me=this;
     me.x='';
     me.x='';
     me.x='';
      me.x='';
     me.x='';
     me.x='';
     me.x='';
     me.x='';
     me.x='';
      me.x='';
     me.x='';
     me.x='';
  },
  c : function() {
      var me=this;
     me.x='';
     me.x='';
     me.x='';
      me.x='';
     me.x='';
     me.x='';
     me.x='';
     me.x='';
     me.x='';
      me.x='';
     me.x='';
     me.x='';
  }
}

缩小为

var test={a:function(){var a=this;a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x=""},b:function(){var a=this;a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x=""},c:function(){var a=this;a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x=""}}

转换为大约10%或多或少的字符(当然这取决于代码的块范围中重复使用“this”的数量)。

答案 8 :(得分:1)

专门针对ExtJS框架。

ExtJS有自己的机制来处理有问题的Javascript范围,缩小是唯一var me = this的原因。

this Sencha Forum thread中有关于此主题的更多详细信息。

答案 9 :(得分:1)

在使用ExtJs时,我没有发现这个有用的约定。我没经常使用闭包。在像AngularJs这样的其他框架中工作时,这个惯例给我带来了很大的痛苦和痛苦。让你的范围错误是一个耗时的错误追踪。一旦我开始使用这个约定,我再也没有错误的范围。