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

tes*_*ter 0 javascript performance

如果我从另一个方法多次访问this.something,缓存"this"并访问something()会更快吗?或者我应该反复使用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>
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 5

更新:检查CMS的评论下面的真实情况(但我不认为它会改变任何性能).


近似真相:

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

激活对象具有属性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)
                            +--------------------+
Run Code Online (Sandbox Code Playgroud)

高性能JavaScript中窃取图形.这是一本有趣的书.

  • 不要相信你在书上读到的所有东西(特别是JS书籍;)这次Zakas弄错了;),`this`在技术上不是激活对象*的属性,尽管这个概念与当前的执行密切相关上下文.在ES5,每一个[执行上下文(http://j.mp/gz2m2C)具有国家**组件称为`ThisBinding`,但它是不是一个真正的**财产作为`arguments`和其它标识符在声明范围是.`this`只是一个[Keyword](http://j.mp/ib0WJ3),它计算当前执行上下文的`ThisBinding`组件的值. (2认同)