【问题标题】:why use var slice instead of Array.prototype.slice in a closure? [duplicate]为什么在闭包中使用 var slice 而不是 Array.prototype.slice? [复制]
【发布时间】:2013-03-11 10:26:55
【问题描述】:

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

【问题讨论】:

  • 可能正在缓存切片方法以备后用..!
  • 性能和可读性,我猜...
  • 也许可读性?或者稍后有人可能会碰巧Array.prototype.slice,您会得到意想不到的结果。

标签: javascript closures


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      • getVar“切片”

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

      • getVar "数组"
      • getMember“原型”
      • getMember“切片”

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

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

      【讨论】:

        猜你喜欢
        • 2019-01-20
        • 2012-05-21
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        • 2018-08-31
        • 2011-06-19
        • 1970-01-01
        • 2018-01-06
        相关资源
        最近更新 更多