Javascript 在Array.prototype.apply中使用fn而不使用此参数?

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

我正在看一个教程,为什么可以调用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);

    };

    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;
}