好吧,让我们通过替换来解决这个问题。我们从:
Function.prototype.call.apply(Array.prototype.slice, arguments);
我们所知道的:
Function.prototype.call
是一个函数。
- 指向的
this
指针。call
Function.prototype
- 我们
apply
用来改变 to的this
指针。call
Array.prototype.slice
arguments
应用于(不作为参数传递)到call
.
因此上面的语句等价于:
Array.prototype.slice.call(arguments[0], arguments[1], ...);
由此我们看到:
Array.prototype.slice
是一个函数。
- 指向的
this
指针。slice
Array.prototype
- 我们
call
用来改变 to的this
指针。slice
arguments[0]
arguments[1], ...
作为参数传递给slice
.
这与以下内容相同:
arguments[0].slice(arguments[1], ...);
这样做的好处是我们在一行中创建了一个快速的未绑定包装器。slice
编辑:创建快速未绑定包装器的更好方法如下(请注意,它可能在某些较旧的浏览器中不起作用,但您现在不必担心 - 您可能总是对不支持的浏览器使用shim支持bind
):
var slice = Function.prototype.call.bind(Array.prototype.slice);
这与以下内容相同:
function slice() {
return Function.prototype.call.apply(Array.prototype.slice, arguments);
}
这个怎么运作:
Function.prototype.call
是一个函数。
- 指向的
this
指针。call
Function.prototype
- 我们
bind
用来改变 to的this
指针。call
Array.prototype.slice
bind
返回一个应用于的arguments
函数。call
奖励:如果您的编程风格像我的那样功能强大,那么您会发现这段代码非常有用:
var funct = Function.prototype;
var obj = Object.prototype;
var arr = Array.prototype;
var bind = funct.bind;
var unbind = bind.bind(bind);
var call = unbind(funct.call);
var apply = unbind(funct.apply);
var classOf = call(obj.toString);
var ownPropertyOf = call(obj.hasOwnProperty);
var concatenate = call(arr.concat);
var arrayFrom = call(arr.slice);
- 使用它,您可以使用
call
或轻松创建未绑定的包装器apply
。
- 您可以使用
classOf
来获取[[Class]]
值的内部。
- 您可以使用
ownPropertyOf
inside for in 循环。
- 您可以使用
concatenate
加入阵列。
- 您可以
arrayFrom
用来创建数组。