我正在尝试编写一个静态版本的切片。
之间有什么区别
Function.prototype.call.bind(Array.prototype.slice)
和
Array.prototype.slice.call.
如果我写:
var x = Array.prototype.slice.call;
x([1,2,3]);
我得到了
TypeError: object is not a function.
为什么会这样?
答案 0 :(得分:1)
函数Array.prototype.slice.call
与Function.prototype.call
的功能完全相同。它不知道Array.prototype.slice
应该是this
,除非您将其称为方法,如下所示:
Array.prototype.slice.call(whatever);
或者如果您使用其他一些方法告诉它this
是什么。当您将其分配到x
时,会丢失this
信息。
Function.prototype.call.bind(Array.prototype.slice)
创建 知道Array.prototype.slice
为this
的函数。即使您将它附加到一个新对象并将其作为新对象的方法调用它:
x = {call: Function.prototype.call.bind(Array.prototype.slice)}
x.call([1, 2, 3])
它的行为就好像被称为Array.prototype.slice.call
而不是x.call
。
答案 1 :(得分:0)
这是你的提示 - 这是真的:
Array.prototype.slice.call == (function() {}).call
call
是Function.prototype
的成员 - 它希望this
参数指向要调用的函数。您没有传递任何内容,因此this
引用window
对象。这将有效:
x = Array.prototype.slice.call.bind(Array.prototype.slice)
但是从我的第一个代码段开始,Array.prototype.slice.call
只是Function.prototype.call
,所以:
x = Function.prototype.call.bind(Array.prototype.slice)
事实上,Function.call == Function.prototype.call
,所以你可以做到
x = Function.call.bind(Array.prototype.slice)