2014-03-12 12 views
5

Ich werde durch JavaScript ninja Tutorial John Resig und auf #51 Ich sehe dies:Warum sollten Sie Math als erstes Argument an Math.max.apply übergeben?

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

allButFirst nur ein kleines Array von ganzen Zahlen ist. Ich glaube, ich verstehe, was apply tut, aber ich kann nicht verstehen, warum Math als Argument an apply übergeben wird.

Antwort

1

Passing es Math ist nicht notwendig, irgendetwas wird hier funktionieren. Math gibt den Kontext der Operation an, max erfordert jedoch keinen Kontext. Dies bedeutet, dass Math.max.apply(undefined, allButFirst) auch funktioniert. Siehe this Antwort.

+4

@JakeSellers Für 'Math.max' speziell, und ich bin sicher, ein paar andere Funktionen, ist es wirklich egal. Der Punkt ist, dass 'Math.max' ** sich nicht auf den 'this'-Wert ** verlässt oder diesen benutzt ... ... aber viele andere Funktionen ** do **. Obwohl es technisch optional ist, würde ich vorschlagen, es immer zu übergeben, weil Sie es normalerweise wie 'Math.max()' nennen (der 'this'-Wert ist 'Math'). Ich wäre lieber sicher als Entschuldigung für so eine kleine Sache, sowie konsequent. – Ian

+0

@ian ok, danke –

+0

@ian in [die Dokumente] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments) für Argumente, können Sie sehen, sie verwenden ' Array.prototype.slice.call (arugments) 'um die Argumente in ein Array zu ändern, ohne dass ein Kontext zum Aufruf gegeben wird. Was ist deine Meinung dazu? Ich benutze diese Technik manchmal, sollte ich mich nicht darum kümmern oder einen Kontext weitergeben, vielleicht nur "das" für den lokalen Funktionskontext? –

0

Von Mozilla docs:

fun.apply (thisArg, [argsArray])

thisArg: Der Wert dieser für den Anruf Spaß zur Verfügung gestellt. Beachten Sie, dass dieser möglicherweise nicht der tatsächliche von der Methode gesehene Wert ist: Wenn die Methode eine -Funktion im nicht strikten Moduscode ist, werden null und undefined durch das globale Objekt ersetzt und primitive Werte werden eingerahmt.

Also, in Ihrem Beispiel Math wird als Rahmen für die Funktion verwendet wird (wenn das Schlüsselwort this wird innerhalb des Hauses).

Wenn kein thisArg verwendet wird, ist der Standardwert das globale Objekt. Es ist also eine gute Übung, wenn möglich einen Kontext anzugeben.

3

Der erste Parameter der .apply ist der Kontext. Innerhalb des Funktionskörpers verweist das Schlüsselwort this auf diesen Wert.

Beispiel:

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

standardmäßig, wenn Sie Math.max der Kontext (das this Schlüsselwort) aufrufen, wird automatisch auf Math gesetzt. Um dieses Verhalten beizubehalten, wird Math als erster Parameter in apply übergeben.

+0

Scope hat nichts mit 'this' zu tun. Das sind zwei verschiedene Dinge. –

+1

Sie haben Recht, ich sollte stattdessen Kontext sagen. Es tut uns leid. – lionel

Verwandte Themen