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

时间:2013-03-11 10:26:56

标签: 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, args.concat(slice.apply(arguments)));
     };
});

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

3 个答案:

答案 0 :(得分:1)

我认为拥有它是一件好事,而不是必须的,即两种方式都可行。

使用别名读取稍微容易一些(因为您需要解析的代码较少)。

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

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

答案 1 :(得分:0)

它可以在没有定义slice的情况下工作,但在此函数中有两次调用Array.prototype.slice,因此最好定义一个“快捷方式”,以使其看起来更好(更短的代码,减少冗余)。

答案 2 :(得分:0)

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

如果您在局部变量中有切片,则在访问它时需要进行单一查找:

  • getVar“slice”

相反,使用Array.prototype.slice通常会转换为多个“说明”:

  • getVar“Array”
  • getMember“prototype”
  • getMember“slice”

从缩小的角度来看,谷歌编译器等工具也会通过将局部变量(在本例中为slice)重命名为单个字母变量来进一步减小大小代码。对于在范围外访问的全局变量,这种情况不会发生(在这种情况下为Array.prototype.slice)。

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