Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在闭包中使用var slice而不是Array.prototype.slice?_Javascript_Closures - Fatal编程技术网

Javascript 为什么在闭包中使用var slice而不是Array.prototype.slice?

Javascript 为什么在闭包中使用var slice而不是Array.prototype.slice?,javascript,closures,Javascript,Closures,在《Oreilly.JavaScript.the.Good.Parts》一书中,有一段代码如下: Function.method('curry', function () { var slice = Array.prototype.slice, args = slice.apply(arguments), that = this; return function () { return that.apply(null, ar

在《Oreilly.JavaScript.the.Good.Parts》一书中,有一段代码如下:

Function.method('curry', function () { 
    var slice = Array.prototype.slice, 
        args = slice.apply(arguments),
        that = this; 
    return function () {
         return that.apply(null, args.concat(slice.apply(arguments)));
     };
});

我想知道为什么不直接使用Array.prototype.slice而不是私有变量,谢谢。

它不需要定义
slice
,但是在这个函数中有两个调用
Array.prototype.slice
,所以最好定义一个“快捷方式”,以便让它看起来更好(代码更短,冗余更少).

从性能角度来看,
slice
在下面的代码中使用了两次。使用快捷方式将减少要键入的代码长度和查找过程

如果在局部变量中有slice,则在访问它时需要进行单个查找:

  • getVar“切片”
相反,使用
Array.prototype.slice
通常会转换为几个“指令”:

  • getVar“数组”
  • getMember“原型”
  • 获取成员“切片”
从缩小的角度来看,像google编译器这样的工具还将通过将局部变量(在本例中为
slice
)重命名为单个字母变量来进一步减少代码大小。对于在作用域之外访问的全局变量(在这种情况下,
Array.prototype.slice


从功能角度来看,
Array.prototype.slice
是动态解析的,因此可以在以后更改。将本地引用分配给
Array.prototype.slice在该时间点指向的函数对象
,可以保证没有其他代码可以更改您现在持有的函数引用。

我认为这是一种很好的方法,而不是必须的方法,即任何一种方法都可以工作

使用别名更容易阅读(因为要解析的代码更少)

如果经常调用curried方法,那么别名将提高性能,因为JavaScript不必通过复杂的规则来取消引用
数组
,然后取消引用
原型


最后,稍后可能会有人覆盖
Array.prototype.slice
(不太可能),或者作者可能已经为此函数调用覆盖了它(也不太可能)。因此,代码确保当您稍后调用它时,它的行为就像您立即执行它一样。

可能正在缓存slice方法以供以后使用。。!性能和可读性,我想…也许是可读性?或者有人可能会在以后偶然发现
Array.prototype.slice
,你会得到意想不到的结果。