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

Javascript 取消引用变量的闭包有用吗?,javascript,closures,dereference,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 = Arr

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

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
是否会在运行时更改

那么:创建用于创建切片函数的本地引用的闭包是否会加快脚本的速度?或者,附加的闭包作用域是否会使它比访问数组的属性“prototype”的属性“slice”更慢?

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

Tbh,“现代”浏览器确实对访问进行了大量优化。所有现代js引擎都使用内部查找表来访问属性。但是,您仍然希望缓存那些嵌套很深的内容,因为在旧引擎中,它会一直向下遍历所有相关对象来解析它

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


<>特别是Internet Explorer

如果您想多次访问某个属性,请考虑将其赋值给本地变量。然而,对于现代javascript引擎来说,这样的微优化几乎没有什么不同,最重要的是编写表达您意图的代码。

对于这个特定问题,您希望有一个实用功能:

function toArray( arrayLike ) {
    return Array.prototype.slice.call( arrayLike );
}
。。。或者,如果您关心性能:

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

    return function ( arrayLike ) {
        return slice.call( arrayLike );
    };
})();

你不想让
切片。调用
构造你所有的代码

仅供参考,它应该是
.slice.call(参数,0)
。除非你对你正在创建的变量有绝对的疯狂,否则我会认为这是浏览器环境中的一种微观优化。或者只是
[].slice.call(arguments)
.FYI,
a.b.c.d[“e”].f
等于
a.b.c.d.e.f
过早的微优化是不好的。特别是如果没有真正的需要的话。但在库中可能还可以。正如Jared Farish所建议的,我已经在上设置了一个测试用例。Firefox和Opera似乎都在加快步伐。但是:在我添加第三个测试用例之前,链和闭包方法完全相等。@Bergi:那个测试用例不是很有用。正如我提到的,如果只访问嵌套属性/方法一次,那么只访问它当然会更快。testcase调用函数,获取引用,然后访问引用。速度必须较慢,无需对其进行基准测试。