Function.prototype.call.bind(Array.prototype.slice)与Array.prototype.slice.call

时间:2014-01-19 22:25:08

标签: javascript functional-programming

我正在尝试编写一个静态版本的切片。

之间有什么区别
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.

为什么会这样?

2 个答案:

答案 0 :(得分:1)

函数Array.prototype.slice.callFunction.prototype.call的功能完全相同。它不知道Array.prototype.slice应该是this,除非您将其称为方法,如下所示:

Array.prototype.slice.call(whatever);

或者如果您使用其他一些方法告诉它this是什么。当您将其分配到x时,会丢失this信息。

Function.prototype.call.bind(Array.prototype.slice)创建 知道Array.prototype.slicethis的函数。即使您将它附加到一个新对象并将其作为新对象的方法调用它:

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

callFunction.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)