解除引用变量的闭包是否有用?

Ber*_*rgi 11 javascript closures dereference

我不确定它是否或何时对解除引用变量有用(提高性能).

var x = a.b.c.d[some_key].f;
while (loop) {
    do_something_with(x);
}
Run Code Online (Sandbox Code Playgroud)

好像比

while (loop) {
    do_somthing_with(a.b.c.d[some_key].f);
}
Run Code Online (Sandbox Code Playgroud)

是需要还是由智能JavaScript引擎自动完成?

但我的实际问题是我是否应该这样做,例如,在图书馆.

(function() {
    var slice = Array.prototype.slice;

    Function.prototype.x = function x() {
        var args = slice.call(arguments, 0);
        ...
    };
})();
Run Code Online (Sandbox Code Playgroud)

要不就

Function.prototype.x = function x() {
    var args = Array.prototype.slice.call(arguments, 0);
    ...
};
Run Code Online (Sandbox Code Playgroud)

引擎无法自动改进,因为它不知道Array.prototype.slice在运行时是否可能会发生变化.

那么:创建一个闭包来创建切片函数的本地引用会使脚本更快吗?或者额外的闭包范围是否比访问Array属性"prototype"的属性"slice"慢?

jAn*_*ndy 10

"解除引用"实际上是一个令人困惑的词.不是这样,你只是在局部变量中缓存一些属性/方法.实际上,无论是访问随机对象上的某些属性/方法还是使用它,都没有区别Array.prototype.slice.这使得很多的感觉,只要你访问这些深层嵌套的属性不止一次.

Tbh,"现代"浏览器确实优化了访问权限.所有现代js引擎都使用内部查找表来访问属性.但是,您仍然希望缓存那些深层嵌套的东西,因为在较旧的引擎中,它会在所有涉及的对象中完全解决它.

使用本地缓存引用的另一个原因是,即使使用某种显式或隐式eval机制,现代js引擎也不会使用哈希查找.

特别是Internet Explorer <9和Firefox 3.5在进入(原型)链的每一步中都会导致严重的性能损失.


需要注意的一点是:不建议对对象方法使用本地缓存(就像使用该slice方法一样).许多对象用于this确定它们被调用的上下文.将方法存储在局部变量中会导致this绑定到global objectnull.因此,请始终确保调用此方法以method.call手动设置上下文.