2017-02-12 3 views
-2

Diese FunktionWarum führt das Protokollieren eines Funktionsausdrucks die Funktion ohne Aufruf aus?

function mapForEach(arr, fn) { 

    var newArr = []; 
    for (var i = 0; i < arr.length; i++) { 
    newArr.push(
     fn(arr[i]) 
    ) 
    }; 

    return newArr; 
} 

var arr1 = [1, 2, 3]; 

von

mapForEach(arr1, function (item) { 
    return item * 2; 
}); // [2,4,6] 

aufgerufen wird und durch diese Variable Erklärung nicht

var arr2 = mapForEach(arr1, function (item) { 
    return item * 2; 
}); 

noch aufgerufen wird, wenn auf der Konsole

console.log(arr2); // [2,4,6] in the console 
angemeldet aufgerufen

Warum ist hier keine Invokation notwendig?

console.log(arr2()); 

Ich bin immer noch nicht klar, wie diese von

unterscheidet
function foo() { return 2 === 2 }; 

Protokolle Funktionsdefinition

console.log(foo); // function foo() { return 2 === 2 } 

in Log-Funktion aufgerufen wird, das Rück logs Wert

console.log(foo()); // true 
+7

Weil es * durch diese Variablendeklaration aufgerufen wird. Warum denkst du anders? Sie ordnen das Ergebnis nur dem Namen 'arr2' zu. Wenn Sie dachten, Sie würden eine Funktion zuweisen, warum haben Sie es als Array bezeichnet? – jonrsharpe

+0

Ich habe es nicht genannt, ich lese es und versuche zu lernen, ein Prozess, der passieren muss, es sei denn, Sie werden mit perfekten Javascriptkenntnissen geboren (das war ich nicht). Ich dachte, dass die Zuordnung des Rückgabewerts im Speicher nicht existiert bis zur Ausführung, die nun nach der Deklaration als arr2() erfolgen müsste, die dann synchron downline in der Ausführung des Programms zur Verfügung stünde. Also habe ich erwartet, dass console.log (arr2) eine Funktionsdefinition protokolliert. Zum Glück haben wir Dinge wie Stapelüberlauf, wo wir Fragen stellen können, auf die wir nicht bereits die Antworten haben, im Gegensatz zu Fragen, die wir machen ...? – nSideOut

+0

Es hilft dir nicht, snarky zu sein. Die Frage "Warum denkst du anders?" Ist explorativ, um herauszufinden, wo deine falschen Vorstellungen liegen, damit wir sie direkt ansprechen können, anstatt dich nur darauf zu verweisen, ein Buch zu lesen (was alle deine Missverständnisse ansprechen sollte, was auch immer sie sind). aber ist auch fast nutzlos allgemein für ein bestimmtes Problem, das Sie haben). – Amadan

Antwort

0

I Denk was hier passiert s nur eine leichte Verwirrung über das Verhalten in der JavaScript-Konsole oder im Rückgabewert von einer var Deklaration.

Die Konsole zeigt immer den Wert der eingegebenen Daten an. der Rückgabewert des Aufrufs einer Funktion. Jedoch ist der Rückgabewert eines varundefined. Dies bedeutet, dass während die mapForEach ohne Zuordnung [2,4,6] angezeigt wird die Funktion tatsächlich in beiden Fällen aufgerufen wird, ist es nur mit var arr2 = die Sache, die Sie erwartet haben, wird nicht angezeigt.

Siehe this question für einige weitere Hintergrund auf den Rückgabewert von einer var Deklaration.

+1

Geringfügige Korrektur: "Der Rückgabewert einer Zuweisung ist" undefiniert "" ist nicht wahr ('arr2 = [2, 4, 6]' ergibt '[2, 4, 6] '); "Der Rückgabewert einer' var'-Anweisung ist 'undefiniert'" liegt näher an der Wahrheit ('var arr = [2, 4, 6]' wird in der Konsole zu 'undefiniert' und kann nicht einmal ein L-Wert in einem Programm sein). – Amadan

+0

Vielen Dank @Amadan - Ich hatte das Gefühl, dass meine Antwort angesichts der Kontexte, in denen der Wert einer Aufgabe verwendet werden kann, nicht genau war, sondern anhand der Beispiele aus dem OP zu erklären versuchte. Wird die Antwort aktualisieren, um zu klären! – mikej

Verwandte Themen