Javascript 为什么在闭包中使用var slice而不是Array.prototype.slice?
在《Oreilly.JavaScript.the.Good.Parts》一书中,有一段代码如下: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
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“原型”
- 获取成员“切片”
slice
)重命名为单个字母变量来进一步减少代码大小。对于在作用域之外访问的全局变量(在这种情况下,Array.prototype.slice
)
从功能角度来看,
Array.prototype.slice
是动态解析的,因此可以在以后更改。将本地引用分配给Array.prototype.slice在该时间点指向的函数对象
,可以保证没有其他代码可以更改您现在持有的函数引用。我认为这是一种很好的方法,而不是必须的方法,即任何一种方法都可以工作
使用别名更容易阅读(因为要解析的代码更少)
如果经常调用curried方法,那么别名将提高性能,因为JavaScript不必通过复杂的规则来取消引用数组
,然后取消引用原型
最后,稍后可能会有人覆盖
Array.prototype.slice
(不太可能),或者作者可能已经为此函数调用覆盖了它(也不太可能)。因此,代码确保当您稍后调用它时,它的行为就像您立即执行它一样。可能正在缓存slice方法以供以后使用。。!性能和可读性,我想…也许是可读性?或者有人可能会在以后偶然发现Array.prototype.slice
,你会得到意想不到的结果。