Javascript 在Array.prototype.apply中使用fn而不使用此参数?
我正在看一个教程,为什么可以调用Array.prototype.pop.apply或调用而不指定thisArg?请注意计算表达式中第1行和第3行的差异 例如:Javascript 在Array.prototype.apply中使用fn而不使用此参数?,javascript,Javascript,我正在看一个教程,为什么可以调用Array.prototype.pop.apply或调用而不指定thisArg?请注意计算表达式中第1行和第3行的差异 例如: var calculate = function () { var fn = Array.prototype.pop.apply(arguments); console.log(fn); return fn.apply(null, arguments); }; v
var calculate = function () {
var fn = Array.prototype.pop.apply(arguments);
console.log(fn);
return fn.apply(null, arguments);
};
var sum = function (x, y) {
return x + y;
};
var diff = function (x, y) {
return x - y;
}
var x = calculate(5, 3, sum);
如果我这样做,我会得到一个错误:uncaughttypeerror:Array.prototype.pop调用null或未定义的Default.aspx:54(匿名函数)
Array.prototype.pop是在数组上调用的,通常不接受参数:
[1,2,3,4].pop()/=>4
Pop是数组实例上的一个方法,因此它显式地使用“this”。它可能有一些内部定义,比如这个可怕的近似:
Array.prototype.pop = function() {
var value = this[this.length - 1];
delete this[this.length - 1];
return value;
}
因此,当您使用一个为null的
this
调用pop
时,它没有任何可访问的信息,因此永远不会使用参数。因为在本例中,参数
列表就是此。您正在有效地调用arguments.pop()
,但是arguments实际上没有pop方法,因此您正在对其应用Array.prototype.pop
方法 您想对像arguments.pop
这样的参数调用pop
,这意味着这个
就是参数。所以它应该是Array.prototype.pop.apply(参数)代码>谢谢你,你的解释很好,数组是一个特殊的例子,它的参数就是这个参数。我得让我的大脑去思考它
Array.prototype.pop = function() {
var value = this[this.length - 1];
delete this[this.length - 1];
return value;
}