在访问同一对象的方法时,是否使用缓存的“this”比“this”更快?

时间:2011-01-21 20:14:42

标签: javascript performance

如果我从另一个方法多次访问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>

4 个答案:

答案 0 :(得分:5)

更新:检查下面的 CMS'评论真实情况(但我认为这不会改变任何有关性能的内容)。< / p>


近似真相:

不,它不会有任何区别。执行该函数后,将创建激活对象并将其放在函数的作用域链的开头(更具体地说,它的执行上下文)。

激活对象具有属性thisarguments,传递的每个参数的一个属性以及函数中声明的每个变量。

因此,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)

此处只会进行分析。但在进行这种微观优化之前,问问自己是否真的需要。