Javascript 缓存此引用的
在大量使用Javascript 缓存此引用的,javascript,performance,Javascript,Performance,在大量使用this的“类”函数中缓存对此上下文的引用有意义吗 我认为缩小器可以用更短的东西取代self,这样会导致文件大小稍微小一些。这样做有什么坏处吗?你会这样做吗?如果不会,为什么不呢 例如: var Klass = function() { var self = this; self.foo = 'qux'; self.bar = 'quux'; self.foobar = true; self.foobaz = false; } 1) Imhovar self=t
this
的“类”函数中缓存对此上下文的引用有意义吗
我认为缩小器可以用更短的东西取代self
,这样会导致文件大小稍微小一些。这样做有什么坏处吗?你会这样做吗?如果不会,为什么不呢
例如:
var Klass = function() {
var self = this;
self.foo = 'qux';
self.bar = 'quux';
self.foobar = true;
self.foobaz = false;
}
1) Imhovar self=this
是一个(作为开发人员)我不想被打扰的结构:我不想为了帮助一个迷你们改变代码。代码应该只存在执行作业所需的行
2) 我还没有看到文件大小差异如此之大的例子,我会重新考虑原则1)从性能角度看,我怀疑会有任何显著的差异。因此,我只能理解使用
self
来代替this
的两个优点:
alert(test(0));
function test(n) {
var thisFunction = createThisFunction(n).toString();
var selfFunction = createSelfFunction(n).toString();
if (selfFunction.length < thisFunction.length) return n;
else return test(n + 1);
}
function createThisFunction(n) {
var body = repeat(n, "this.x=null;");
return new Function(body.join(""));
}
function createSelfFunction(n) {
var decl = "var s=this;";
var body = repeat(n, "s.x=null;");
return new Function(decl + body.join(""));
}
function repeat(n, x) {
if (n === 0) return [];
else return [x].concat(repeat(n - 1, x));
}
self
嵌套函数中的引用self
具有声明成本。因此,如果只需要声明几个参数,那么使用self
是没有意义的。因此,我编写了一个脚本,用于计算何时可以在上使用self
:
alert(test(0));
function test(n) {
var thisFunction = createThisFunction(n).toString();
var selfFunction = createSelfFunction(n).toString();
if (selfFunction.length < thisFunction.length) return n;
else return test(n + 1);
}
function createThisFunction(n) {
var body = repeat(n, "this.x=null;");
return new Function(body.join(""));
}
function createSelfFunction(n) {
var decl = "var s=this;";
var body = repeat(n, "s.x=null;");
return new Function(decl + body.join(""));
}
function repeat(n, x) {
if (n === 0) return [];
else return [x].concat(repeat(n - 1, x));
}
警报(测试(0));
功能测试(n){
var thisFunction=createThisFunction(n).toString();
var selfFunction=createSelfFunction(n).toString();
if(selfFunction.length
答案是。。。drumroll请:。这意味着,如果您声明了三个或更少的参数,那么最好坚持使用This
。如果您有四个或更多参数,则最好使用self
:
具有三个参数的函数缩小时,此
使用的字符比具有自身
的函数少2个字符
具有四个参数的函数缩小时,此
比具有自身
的函数多使用1个字符
你可以玩弄小提琴,自己验证我的断言:
嵌套函数
有时,您需要一个嵌套函数才能访问其父函数的此
参数。在这种情况下,您仍然需要创建一个self
变量。因此,如果您有任何嵌套函数需要访问this
,那么只需切换到self
简而言之,需要访问这个的嵌套函数否决了self
的4个声明规则,我同意1),我也不希望在我的代码中包含这一点,但无论是UglifyJS还是Google Closure编译器都不会自动这样做,所以我想知道这是否被认为是一种不好的做法,或者是因为2),这是不值得的努力。代码的缩小:这只适用于解压缩代码,这是IMHO重要的是要考虑的,因为如果你有兴趣获得每一个字节,JS代码将被传输拉链。嵌套函数:在JavaScript(>JS 1.8)或框架提供函数的情况下,我会考虑这种错误的做法。BID:这也是为什么在我的例子中我分配了四个值的原因;因此,除了声明成本之外,没有其他真正的缺点吗?@Sonata因此,当交付gzip时,如果没有self
变量,它实际上会更小?我不确定您是否可以在不尝试两种方案的情况下为特定代码确定这一点。根据代码的长度、找到字符串的次数等,zip的大小会发生变化。@ HNRCH02如果不考虑Gzip代码,那么使用上面的技术就可以节省一些字节。请参见下表:例如,如果没有参数,那么只会浪费11个字节。但是,对于每个额外的参数,您将保存3个字节(这就是为什么需要4个参数来保存1个字节)。因此,保存的字节数的公式是f(n)=3*n-11
。通过添加11个字符(var s=this;
)可以获得12个删除的字符(4*elf
)?看起来不太划算。使其简单化,并在任何地方使用此
,同时使代码更加清晰。