取消引用变量的闭包有用吗?

2023-11-21

我不确定取消引用变量是否或何时有用(以提高性能)。

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

似乎比

while (loop) {
    do_somthing_with(a.b.c.d[some_key].f);
}

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

但我真正的问题是我是否应该这样做,例如在图书馆里。

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

    Function.prototype.x = function x() {
        var args = slice.call(arguments, 0);
        ...
    };
})();

or just

Function.prototype.x = function x() {
    var args = Array.prototype.slice.call(arguments, 0);
    ...
};

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

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


出于此目的,“取消引用”实际上是一个令人困惑的词。不是那样的,你只是cache局部变量中的某些属性/方法。实际上,无论您是为了访问随机对象上的某些属性/方法还是使用Array.prototype.slice。它使a lot一旦您访问这些深层嵌套的属性,就有意义了不止一次.

老实说,“现代”浏览器确实对访问进行了很多优化。所有现代 js 引擎都使用内部查找表来访问属性。但是,您仍然希望缓存那些深层嵌套的内容,因为在较旧的引擎中,它将一路向下遍历所有涉及的对象来解决它。

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

特别是 Internet Explorer


需要注意的是:不建议对对象方法使用本地缓存(就像您对slice方法)。许多对象使用this以确定调用它们的上下文。将方法存储在局部变量中会导致this被束缚于global object or null。 所以一定要确保调用这样的方法method.call手动设置上下文。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

取消引用变量的闭包有用吗? 的相关文章

随机推荐