如果我从另一个方法多次访问this.something,是否可以更快地缓存“this”并访问某些内容()或者我应该一遍又一遍地使用this.something()?
<script type="text/javascript">
var Foo = (function() {
return {
something: function() {
// Do something
},
stuff: function(obj) {
this.something(obj);
// ...
this.something(obj);
/* OR should I cache this? */
var $that = this;
$that.something(obj);
// ...
$that.something(obj);
}
};
}());
</script>
答案 0 :(得分:5)
更新:检查下面的 CMS'评论真实情况(但我认为这不会改变任何有关性能的内容)。< / p>
近似真相:
不,它不会有任何区别。执行该函数后,将创建激活对象并将其放在函数的作用域链的开头(更具体地说,它的执行上下文)。
激活对象具有属性this
,arguments
,传递的每个参数的一个属性以及函数中声明的每个变量。
因此,this
和$that
生活在同一范围内,您无法从中获益。当您在本地引用更高范围的对象/值时,您只会得到改进。
+-------------------+ +-------------+
| Execution Context | +->| Scope Chain |
| ----------------- | | | ----------- |
| Scope chain +----+--+ | 0 | +---+----------+
+-------------------+ | 1 | +---+-... |
+-------------+ |
|
|
|
+--------------------+ |
| Activation Object |<--+
| ------------------ |
| this | foo | (if called with foo.method())
| arguments|[someObj]|
| obj | someObj |
| $that | foo | (undefined until assignment)
+--------------------+
来自High Performance JavaScript的图片被盗。这是一本有趣的书。
答案 1 :(得分:3)
您只需指向对象引用的副本,而不是直接指向对象的引用。我无法想象缓存会更快 - 但是,嘿,启动一个测试框架,在一个循环内执行10000次,看看它是否有任何区别。
答案 2 :(得分:1)
我不明白为什么变量应该比this
快。
可能更快但我发现不起作用的东西是缓存整个方法查找...例如做m = object.method; ... m(x,y,z);
。这是例如在Python中工作的(因为绑定方法概念),但是在Javascript中不可用。
Javascript中方法查找的结果为您提供了或多或少的东西,比如C ++的方法指针,换句话说是一个不知道this
的函数,所以你必须提供{{1}你可以自己调用它。
唯一的区别是在C ++中,任何未声明为static的方法在不提供this
的情况下都不可调用,而在Javascript中保存方法查找可能显然仅适用于那些方法在运行时不需要this
按预期执行。
例如,Chrome上的this
至少显然有效,因为var mycos = Math.cos; mycos(0.3);
不需要访问数学(毕竟不是那么令人惊讶)。
你可以得到一个在功能上用作缓存方法的闭包......
cos
这可能是有用的其他原因,但IMO它不会更快(它可能更慢确实)...
答案 3 :(得分:0)
此处只会进行分析。但在进行这种微观优化之前,问问自己是否真的需要。