2014-03-12 62 views
5

我經歷約翰Resig的JavaScript的忍者教程和#51我看到這一點:爲什麼要將Math作爲Math.max.apply的第一個參數?

// Find the largest number in that array of arguments 
var largestAllButFirst = Math.max.apply(Math, allButFirst); 

allButFirst是整數的只是一小陣。我相信我明白apply做什麼,但我不明白爲什麼Math作爲參數傳遞給apply

回答

1

通過它Math是沒有必要的,任何東西都可以在這裏工作。 Math指示操作的上下文,但max不需要上下文。這意味着Math.max.apply(undefined, allButFirst)也將工作。請參閱this的答案。

+4

@JakeSellers對'Math.max'具體而言,我確定其他一些功能,這真的沒有關係。關鍵是'Math.max' **不依賴或使用'this'值** ......但許多其他函數**都可以**。雖然它在技術上是可選的,但我會建議總是傳遞它,因爲**通常**稱它爲'Math.max()'(''這個'值是'Math')。我寧願安全,也不要對這樣一件小事感到抱歉,也要保持一致。 – Ian

+0

@ian ok,謝謝 –

+0

@ian在[文檔](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments)中的參數,你可以看到他們使用' Array.prototype.slice.call(arugments)'將參數更改爲一個沒有上下文給定的數組。你對此有何看法?我有時候會使用這種技術,如果我不擔心它或傳遞一個上下文,或許只是本地函數上下文中的「this」 –

0

Mozilla docs

fun.apply(thisArg,[argsArray])

thisArg:提供用於調用樂趣的這個值。請注意,此 可能不是該方法看到的實際值:如果該方法是非嚴格模式代碼中的 函數,則空值和未定義值將被全局對象替換爲 ,並且原始值將被裝箱。

所以,在你的榜樣,Math被用作該函數的上下文(如果關鍵字this是內部使用)。

如果沒有使用thisArg,則默認爲全局對象。所以,如果可能的話,給出一些上下文是一個好習慣。

3

.apply的第一個參數是上下文。在函數體內部,this關鍵字將引用該值。

例子:

function sum(a){ return this + a; } 
sum.apply(1, [1]); // will return 2 
// or with .call 
sum.call(1, 1); // also returns 2 

默認情況下,如果你打電話Math.max的上下文(this關鍵字)會自動設置爲Math。爲了保持這種行爲,Math作爲apply中的第一個參數傳遞。

+0

範圍與'this'無關。這是兩回事。 –

+1

你說得對,我應該說上下文來代替。抱歉。 – lionel

相關問題