2016-09-09 4 views
3

Ich habe eine Funktion und ich rufe es einmal, aber wenn ich es im Browser ausführen, scheint es zweimal zu laufen.Probleme im Zusammenhang mit der Anwendung Anruf

function max() { 
 
\t console.log(arguments[0]); 
 
\t return this.max.apply(Math, Array.from(arguments[0])); 
 
} 
 

 
console.log(max([1,32,42,1])); 
 

 
/* 
 
This is output of console: 
 
------------------------ 
 
[1, 32, 42, 1] 
 
1 
 
-Infinity 
 
*/

möchte ich den maximalen Wert eines Arrays erhalten, und ich weiß schon, wie es now.I zu bekommen nur fragen, warum diese Funktion scheint, wie zweimal ausführen und warum diese Funktion nicht bekommen kann das richtige Ergebnis.

+0

'there' bezieht sich auf' window' und 'global-functions' sind' properties' von 'window-object'. 'Funktion # apply' ruft die Funktion mit übergebenem' this' Argument als 'this' Kontext in' called-function' auf – Rayon

+0

Gibt es einen bestimmten Grund, warum Sie 'arguments [0]' anstelle von nur einem regulären Parameter verwenden? –

Antwort

1

Wo this bezieht sich auf Fenster-Objekt so Int nur aufrufen die gleiche Funktion rekursiv, da window.max bezieht sich auf die gleiche Funktion. Beim zweiten Anruf bezieht sich this auf Math, da Sie Math als dieses Argument in Fuction#apply definiert sind. Beim wiederholten Aufruf der Funktion max würde das erste Argument 1 lauten, und Array.from erzeugt ein leeres Array, so dass Math.max als Ergebnis -Infinity zurückgegeben wird.

Um es funktionieren zu lassen ersetzen this mit Math Objekt, obwohl Array.from ist überhaupt nicht notwendig.

function max() { 
    return Math.max.apply(Math,arguments[0]); 
} 

Oder einfach das Array als normale Argument übergeben.

function max(arr) { 
    return Math.max.apply(Math, arr); 
} 
+0

Wegen 'Function # apply' – Rayon

+0

Ist der 2. Aufruf gleich' Math.max ([]) '? – napoleonQin

+0

@QinXiaofu ja ..... –

2

Verwenden Math.max.apply

function max() { 
    //console.log(arguments[0]); 
    return Math.max.apply(Math, arguments[0]); 
} 
+1

Was ist der Punkt von 'Array.from (Argumente [0])', anstatt nur 'vals' zu schreiben, wobei' vals' der Parameter für die Funktion ist? –

+0

@torazaburo ja du hast Recht, wir können Argumente verwenden [0] wie es ist anstelle von 'Array.from (Argumente [0])', danke;) guten Fang –

1
function max() { 
console.log(arguments[0]); 
return this.max.apply(Math, Array.from(arguments[0])); 
} 

In diesem Verfahren bezieht sich auf this Fenster als @JaydipJ erwähnt. Wenn Sie ein Math-Objekt übergeben möchten;

function max(){ 
var x=this.max.apply(null,[0,1,2,3]); 
console.log(x); 
} 

max.apply(Math); 
Verwandte Themen