0

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 而不是私有变量,谢谢。

4

3 回答 3

1

我认为这是一个很好的,不是必须的,即任何一种方式都可以。

使用别名阅读起来稍微容易一些(因为要解析的代码更少)。

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

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

于 2013-03-11T10:33:06.957 回答
0

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

于 2013-03-11T10:30:30.273 回答
0

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

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

  • getVar“切片”

相比之下,使用Array.prototype.slice通常会转化为几个“指令”:

  • getVar“数组”
  • getMember“原型”
  • 获取成员“切片”

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

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

于 2013-03-11T10:31:47.737 回答