Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
return function(){
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};
在此示例中,为什么将其编码为
args = Array.prototype.slice.call(arguments)
如果我这样做会好吗
args = arguments.slice();
我只是想了解使用call
还有什么其他情况我们必须使用Array.prototype.slice.call(arguments)
?
答案 0 :(得分:12)
arguments
是类似数组的对象,它不是Array
。因此,它没有slice
方法。您需要从slice
获取Array
实施,并将其设置为this
上下文设置为arguments
。这将返回实际 Array
,这是此操作的重点。
答案 1 :(得分:6)
arguments
不是数组:
function a(){console.log(typeof(arguments)) }
因此a(123)
会产生object
所以我们借用 可以处理像对象这样的数组的方法, slice 对象,就好像它是真正的数组一样。
借用可以通过call
或apply
进行。
apply
会将参数作为数组发送(请记住:a
array
) - 而call
会以逗号分隔值发送参数。