2017-12-29 12 views
2

Kann nicht undestand, warum die Argumente von Funktionen F1000 und F1500 sind nicht auf die Wrapper-Funktion Verzögerung geben.undefinierter Wert anstelle der Argumente in der Funktion „f1 ....“

Für jetzt bekomme ich undefined anstelle der richtigen Ergebnisse von Test und Test2.

function f(x) { 
    console.log(x); 
} 

function delay(f, ms) { 
    return function() { 
     setTimeout(function(){ 
      var delayed = f.apply(this, arguments); 
      return delayed; 
     }, ms); 
    } 
} 

var f1000 = delay(f, 1000); 
var f1500 = delay(f, 1500); 

f1000("test"); // must display "test" 
f1500("test2"); // must display "test2" 

Antwort

4

Sie übergeben die falsche arguments.

Sie erhalten undefined weil the arguments object is a local variable.
Die Rückruffunktion, die an setTimeout übergeben wird, hat keine Argumente, daher erhalten Sie undefined.

Sie schließen können (closure) über die arguments vom äußeren Umfang und geben sie an:

function f(x) { 
 
    console.log(x); 
 
} 
 

 
function delay(f, ms) { 
 
    return function() { 
 
    var args = arguments; 
 
    setTimeout(function() { 
 
     var delayed = f.apply(this, args); 
 
     return delayed; 
 
    }, ms); 
 
    } 
 
} 
 

 
var f1000 = delay(f, 1000); 
 
var f1500 = delay(f, 1500); 
 

 
f1000("test"); // 
 
f1500("test2"); //

+0

@ savig_b.g Du hast Recht! Aber ich verstehe nicht, warum wir Argumente nicht direkt in den Timer schieben können? Danke –

+1

Das liegt daran, dass [das Objekt 'Argumente' eine lokale Variable ist] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments). Die Callback-Funktion, die an 'setTimeout' übergeben wurde, hat keine Argumente, daher erhalten Sie undefined. Eine Möglichkeit, einen äußeren Geltungsbereich zu erreichen, besteht darin, einen Abschluss zu verwenden (wie im Beispiel). Ich habe meine Antwort aktualisiert, um dies auch zu erklären. –

+0

Vielen Dank für die Erklärung! Ich brauche wahrscheinlich mehr Übung in Schließfunktionen :) –

Verwandte Themen