2014-01-13 39 views
0

我在看教程,为什么你可以调用Array.prototype.pop.apply或者在没有指定thisArg的情况下调用?注意计算表达式中第1行和第3行的差异。在没有thisargument的情况下在Array.prototype.apply中使用fn?

例如:

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

如果我这样做,我得到一个错误:未捕获的类型错误:Array.prototype.pop呼吁null或未定义的Default.aspx:54(匿名函数)

var fn = Array.prototype.pop.apply(null, arguments); 
+2

你想在'arguments.pop'这样的参数上调用'pop',这意味着'this'是参数。所以它应该是'Array.prototype.pop.apply(arguments);' –

回答

1

Array.prototype.pop称为阵列上,并没有考虑正常参数:

[1, 2, 3, 4].pop() //=> 4

Pop是一个Array实例的方法,因此它明确使用“this”。它可能有这样可怕的逼近一些内部定义:

Array.prototype.pop = function() { 
    var value = this[this.length - 1]; 
    delete this[this.length - 1]; 
    return value; 
} 

所以,当你调用popthis是零,它没有任何访问信息,从不使用的参数。由于was said在这种情况下,arguments列表this。您实际上正在呼叫arguments.pop(),但参数实际上没有弹出方法,因此您正在对其应用Array.prototype.pop方法。

+0

谢谢你,你的解释很好,数组是一个特例,它的参数就是这个参数。我必须让我的大脑环绕它 – runners3431

相关问题