我在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;
},
答案 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)
除了样式原因和缩小原因外,我决定查看效果,看看this
或self
是否更快。我创建了这个jsperf test。
我可以说,在我使用this
使用self
或{{{{}}}这样的局部变量时,我尝试过的任何现代浏览器甚至IE6的性能基本没有差异。 1}}。使用me
时,Chrome的速度会稍微快一点,其他人的距离太近了。我认为我们可以排除任何性能原因。这是我看到的结果的屏幕截图:
答案 3 :(得分:4)
问题很可能与闭包函数有关,例如在注册回调时作为参数。在这种情况下,“this”可以具有完全不同的值,因此他们需要使用“me”。
答案 4 :(得分:4)
有时候在闭包中保持范围,但主要是(如在发布的示例中)允许缩小,因为me
可以缩小到一个字符,而this
不能更改。在给定函数中大约3或4次this
用法之后,这变得很重要(少于那个,你实际上可能会从额外的声明代码中得到一些额外的字节)。就这么简单 - 它与编程风格或奇思妙想无关。
答案 5 :(得分:2)
基于您刚刚添加的Ext.panel.Panel
示例,除非我对Javascript变量的理解非常错误,否则不在此处进行分配将对代码的作用完全没有影响。
唯一的可能性是风格。
虽然我会将其视为过度工程,但如果您想要在此上下文中添加需要访问this
的回调,那么您将不需要返回更改所有内容this
到me
的{{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这样的其他框架中工作时,这个惯例给我带来了很大的痛苦和痛苦。让你的范围错误是一个耗时的错误追踪。一旦我开始使用这个约定,我再也没有错误的范围。