Ich gehe die Mozilla-Dokumente über Schließungen durch und frage mich, warum der folgende Code nicht funktionieren würde. Könnte jemand klären, warum das Folgende nicht funktioniert, während das Definieren und Aufrufen einer Variablen funktioniert.

var outerFunction = function(inp) {
    var input = inp;
    var innerFunction = function() {
         console.log(inp);
    };
    return innerFunction;
};

outerFunction(32); //returns nothing

Vs

var outerFunction = function(inp) {
    var input = inp;
    var innerFunction = function() {
         console.log(inp);
    };
    return innerFunction;
};

 var newFunc =    outerFunction(32);
 newFunc();    // returns 32

Danke und Entschuldigung, wenn dies eine dumme Frage ist.

2
Bazinga777 11 Aug. 2015 im 18:18

4 Antworten

Beste Antwort

Der zweite Code führt die Funktion aus, die Sie als Rückgabeobjekt für die erste Funktion erhalten (beachten Sie, dass Ihre Funktion eine Funktion zurückgibt, die zum Ausführen aufgerufen werden muss). Sie können die Rückgabefunktion selbst aufrufen, dann funktioniert sie, ohne sie einer anderen Variablen zuzuweisen:

 var outerFunction = function(inp) {
    var input = inp;
    var innerFunction = function() {
         console.log(inp);
   };
   return innerFunction;
};

(outerFunction(32)()) //returns 32
2
connexo 11 Aug. 2015 im 15:28

Ihr erster Codeausschnitt gibt nichts zurück, sondern einen Funktionsobjekt oder dasselbe, das Sie newFunc im zweiten Snippet zuweisen:

var outerFunction = function(inp) {
    var input = inp;
    var innerFunction = function() {
         console.log(inp);
   };
   return innerFunction;
};

console.dir(outerFunction(32));

enter image description here

Sie müssen diese zurückgegebene Funktion in Klammern aufrufen, wenn Sie ihren Wert zurückgeben möchten, genau wie Sie newFunc() im zweiten Snippet aufrufen:

(outerFunction(32)());
// 32
1
rink.attendant.6 11 Aug. 2015 im 15:22

Die Anweisung return innerFunction; gibt ein Funktionsobjekt (eine Instanz der Funktion innerFunction) zurück, nicht dessen Ausführung. Deshalb müssen Sie es mit "instanziieren"

var newFunc = outerFunction(32);

Und führt es dann mit aus

newFunc();

outerFunction ist wie eine Funktionsfactory: Es wird eine Funktion erstellt, die ausgeführt werden muss, um ein Ergebnis zu erhalten.

0
Matteo G. 11 Aug. 2015 im 15:26

outerFunction gibt eine Funktion zurück. In Ihrem ersten Beispiel wird diese Funktion jedoch nie aufgerufen.

function createFunction(num) {
  return function() {
    alert(num);
  }
}

// Created a new function, without calling it
var myFunction = createFunction(32); 

// Call that function
myFunction();
1
Arnold Daniels 11 Aug. 2015 im 15:21