2016-08-06 15 views
-2

Art von einem einfachen. Kannst du mir helfen zu erklären, warum die Zeile "console.log (" test ", nn)})" nn als undefiniert und nicht als Wert 3 anzeigt? Vielen Dank. Hier ist das Code-Snippet.JavaScript 'undefined'

function unless(test, then) { 
    if (!test) then(); 
} 
function repeat(times, body) { 
    for (var i = 0; i < times; i++) body(i); 
} 

repeat(3, function(n) { 
    var nn = unless(n % 2, function() { 
    return 1 * 3 
    }); 
    console.log("test", nn) 
}); 
+4

'es sei denn,()' nichts zurückgibt . – JJJ

+1

@Juhana Dieser Kommentar sollte eine Antwort sein. – Siguza

+1

Diese Frage sollte geschlossen und nicht beantwortet werden. – JJJ

Antwort

1

Ihre unless() Funktion gibt nichts zurück. So

var nn = unless(...); 

bedeutet, dass nn nur undefined sein wird. Um nn einen Wert zu haben, muss Ihre unless() Funktion einen Wert zurückgeben.

In hier:

function unless(test, then) { 
    if (!test) then(); 
} 

Es gibt keine return Aussage. Der Callback then() gibt möglicherweise einen Wert zurück, aber dieser Wert wird nur innerhalb von unless() verfügbar gemacht, wenn Sie ihm einen Wert zugewiesen haben. Wenn Sie möchten, dass unless() selbst einen Wert zurückgibt, müssen Sie eine oder mehrere geeignete return-Anweisungen hinzufügen.

Zum Beispiel könnten Sie einen Teil des Problems beheben, indem Sie einfach den then() Wert zurück wie:

function unless(test, then) { 
    if (!test) return then(); 
} 

Aber Sie müssen noch einen Rückgabewert für den Fall, dass test truthy ist. Ich bin mir nicht sicher, was Sie, dass Rückgabewert in diesem Fall sein wollen, damit ich weiß nicht, was zu empfehlen, aber die allgemeine Form dies sein könnte:

function unless(test, then) { 
    if (!test) { 
     return then(); 
    } else { 
     return somethingelse; // assign some return value when `test` is truthy 
    } 
} 
+0

Danke für Ihre Hilfe. Ich schätze es. Das ist sehr hilfreich –

1

Sie versuchen nn aus dem Ergebnis der Funktion unless derzeit unless() kehrt undefined und damit das Ergebnis des Ausdrucks ist undefined zuzuordnen.

Die Rückkehr in Ihrer Callback-Funktion then() ist nicht in den Anwendungsbereich für nn das Ergebnis zu erfassen, ist es auf den Umfang der unless() gibt, die keine return-Anweisung hat, was bedeutet, dass var nn aufgrund nichts undefiniert ergeben wird zurückgegeben.

Um dies zu beheben, wenn Sie den rekursiven Teil des Algorithmus durchführen, sollten Sie auf eine Variable im Rahmen der unless() zuweisen und dann zurück, dass:

function unless(test, then) { 
    var result = test; 
    if (!test) { 
     result = then(); 
    } 
    return result; 
} 
function repeat(times, body) { 
    for (var i = 0; i < times; i++) body(i); 
} 

repeat(3, function(n) { 
    var nn = unless(n % 2, function() { 
    return 1 * 3 
    }); 
    console.log("test", nn) 
}); 

Jetzt 3, 1, 3 kehrt

+1

@ZakariaAcharki Es gibt keinen Unterschied. – Siguza

+1

@ZakariaAcharki Nicht für mich, für JavaScript. Man könnte argumentieren, dass "nichts" durch das Testen "undefiniert" ist. (Function (arg) {console.log (arg === undefined)})() '- Du übergibst" nothing "an die Funktion, vergleiche sie mit undefined ', und es ergibt' wahr'. Daher ist "nichts" gleich "undefiniert". – Siguza

+0

@Siguza meine Antwort geändert, wie Sie sagten, nichts ist wirklich undefiniert ist ein gültiger Punkt. Obwohl es immer am besten ist, den "undefined" Fall elegant zu behandeln – Alex

Verwandte Themen