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 object或null.因此,请始终确保调用此方法以method.call手动设置上下文.