2016-04-21 13 views
0

In dem folgenden Code möchte ich einen Verweis auf eine Funktion, die auf dem übergeordneten Bereich befindet, an den verschachtelten Bereich der Funktion "geschachtelt" übergeben, so dass ich die Funktion auf dem aufrufen kann Parent-Bereich aus der verschachtelten Funktion. Ich habe versucht, es als Parameter übergeben, aber es funktioniert nicht. Ich lerne nur mit verschachtelten Verschlüssen herum und frage mich, ob das gemacht werden könnte.Übergeben Sie eine Funktionsreferenz an eine geschachtelte Closure

Ich möchte die Syntax haben nested für den Aufruf sein: callme.nested()

var obj = function(val){ 
var access = val; 
var apex = 0; 
return { 
    callme : (function(siblyng){ 
     var privatevar = 2; 
     return { 
      nested : function(){ 
       privatevar++; 
       apex = privatevar; 
       return access + " " + privatevar + " " + siblyng("child"); 
      } 
     } 
    })(this.sibling), 
    assess : function(){ 
     return apex + " " + this.sibling("parent"); 
    }, 
    sibling : function(val){ 
     return "returned from " + val + " scope"; 
    } 
} 
} 
var objref = obj(true); 
console.log(objref.callme.nested()); 
console.log(objref.callme.nested()); 
console.log(objref.callme.nested()); 
console.log(objref.assess()); 
console.log(objref.sibling('global')); 
+2

"* übergeben Sie einen Verweis auf eine Funktion im übergeordneten Bereich auf den verschachtelten Bereich der Funktion geschachtelt *". Bitte klären Sie, welche die Referenz ist, welche die residierende Funktion ist, welcher der übergeordnete Bereich ist, welcher der verschachtelte Bereich ist und welche die geschachtelte Funktion ist. – Oriol

+0

ich denke, die am nächsten zu bekommen von den Begriffen "Funktion Nesting & Closures" sind Funktionen höherer Ordnung. Dies sind Funktionen, die andere Funktionen zurückgeben (und erzeugen). http://eloquentjavascript.net/05_higher_order.html Das Verschachteln von verschachtelten/selbst-referenzierenden Daten wird höchstwahrscheinlich nur ein Durcheinander erzeugen. – lipp

+0

@Oriol, habe ich meine Frage aktualisiert, was ich tun möchte, ist die Funktion 'Geschwister' aus der verschachtelten Funktion 'geschachtelt' zu nennen. Ich habe jedoch zwei verschiedene Möglichkeiten ausprobiert, um einen Verweis auf die Funktion zu übergeben, und keiner hat funktioniert. – user2912840

Antwort

0

Wenn ich Sie richtig verstanden, Sie können es tun, wie so

var obj = function(val){ 
var access = val; 
var apex = 0; 
var ret; 
return (ret = { 
    callme : function() { 
     var privatevar = 2; 
     return { 
      nested : function(){ 
       privatevar++; 
       apex = privatevar; 
       return access + " " + privatevar + " " + ret.sibling("child"); 
      } 
     }; 
    }(), 
    assess : function(){ 
     return apex + " " + this.sibling("parent"); 
    }, 
    sibling : function(val){ 
     return "returned from " + val + " scope"; 
    } 
    }); 
}; 

var objref = obj(true); 
console.log(objref.callme.nested()); 
console.log(objref.callme.nested()); 
console.log(objref.callme.nested()); 
console.log(objref.assess()); 
console.log(objref.sibling('global')); 
+0

bitte klären, wo ist das Problem? –

+0

var privatevar = 2, sliblng = this.sibling; // here Sie könnten auch Pfeil-Funktionen verwenden (aber das ist eine der ES 2015-Standards und daher wird es nicht in älteren Browsern unterstützt, so müssten Sie transpilers wie Babel oder Traceur verwenden). –

+0

Sie können einen [Getter] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) festlegen, damit es so funktioniert, wie Sie es beschrieben haben. Du müsstest also 'get callme() {' anstelle von 'callme: function() {' –

0

Ihre this im folgenden Code war zeigt auf das Objekt global Window und so war es nicht in der Lage, die Methode zu finden. Sie hätten direkt this.sibling in Ihrer nested Methode aufrufen können, ohne sie übergeben zu müssen.

callme : (function(siblyng){ 
    var privatevar = 2; 
    return { 
     nested : function(){ 
      privatevar++; 
      apex = privatevar; 
      return access + " " + privatevar + " " + siblyng("child"); 
     } 
    } 
})(this.sibling), 
+0

Das "Dies" in der verschachtelten Funktion zeigt auf das Objekt, das diese Funktion enthält, also nicht auf das Objekt, auf das er sich bezieht (das mit der Geschwisterfunktion). –

+0

Ja, ich meinte deine Lösung. –

Verwandte Themen