我不确定取消引用变量是否或何时有用(以提高性能)。
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/