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

标签 javascript closures dereference

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

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);
        ...
    };
})();

或者只是

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

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

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

最佳答案

“解除引用”实际上是一个令人困惑的词。事实并非如此,您只是在局部变量中缓存一些属性/方法。实际上,无论您是为了访问随机对象上的某些属性/方法还是使用 Array.prototype.slice 来访问这些属性/方法,都没有什么区别。一旦您多次访问这些深度嵌套的属性,它就变得很有意义

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

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

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

<小时/>

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

关于javascript - 取消引用变量的闭包有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13103236/

相关文章:

javascript - 如何使用纯 Javascript 过滤非常大的 Bootstrap 表

javascript - 无法读取未定义错误的属性 'getState'

javascript - Angular 4 - 如果 ngModel 不为空则添加类

generics - 当传递给函数中的泛型闭包时,泛型结构的生命周期不够长

javascript - 在 javascript 闭包中使用 setInterval

rust - 自动解除引用和解除引用强制之间有什么关系?

c - 在返回char字符串的指针之间的差异时,转换和取消引用的顺序有多重要?

javascript - Firebase 身份验证跟踪表?

javascript - 尝试完成这个闭包示例...?

c - 我的这个推理哪里错了?