2014-01-13 78 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

相關問題