if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5 internal IsCallable function
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () {},
fBound = function () {
return fToBind.apply(this instanceof fNOP && oThis
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
我正在查看绑定函数的来源,当我可以直接对我的Array.prototype.slice.call
进行切片时,我正在考虑为什么他们正在进行arguments
。
答案 0 :(得分:2)
因为arguments
不是纯JavaScript数组,而是类数组对象。因此,为了对其进行更改,您必须使用Array.prototype.slice.call
将其转换为实际数组。
来自 MDN :
arguments
对象不是数组。它类似于数组,但是 除了length
之外没有任何数组属性。