我不确定取消引用变量是否或何时有用(以提高性能)。
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(使用前将#替换为@)