2010-05-17 25 views
5

ich den folgenden JavaScript-Code haben:JavaScript - Wie rufe ich eine Funktion innerhalb einer Funktion auf?

function parentFunc() { 

    function childFunc() { 
     ... 
    } 

    ... 
} 

// outside of myParentFunc, how do I call myChildFunc() ? 
childFunc(); // doesn't work 

Wie rufe ich childFunc() von außerhalb parentFunc()?

UPDATE:

weiß, dass ich die offensichtliche Antwort childFun außerhalb von parentFun, aber dies ist ein Dritte-Bibliothek, die ich ändern kann, sich nicht zu bewegen wäre.

+0

+1 Verständnis Funktionsumfang und globale Variablen in JavaScript ist wirklich wichtig. Es ist auch ein guter Ausgangspunkt, um über die prototypische Vererbung zu lernen. – Stephano

Antwort

0

einfach erklärt es außerhalb der Funktion o_O

Nun, wenn die Bibliothek nicht einen Weg, es zu tun liefert, ändern Sie es und laden Sie es mit Ihrem Js, wahrscheinlich die Bibliothek ist nicht zulassen, um es zu tun, weil du es nicht solltest.

+0

kann ich nicht, weil ich mit einer Drittanbieter-Bibliothek verlinke. Also kann ich den Code nicht ändern. – CraigWl

+0

Ich habe die Antwort bearbeitet. –

2

Dies wäre eine Möglichkeit, wie Sie es tun könnten.

var myChildFunction; 

function myParentFunc() { 
    //.... 
    myChildFunction = function() { 
    //.... 
    } 
    myChildFunction(); 
} 

myChildFunction(); 

Hier ist eine andere Art und Weise

var myChildFunction = function() { 
    //....  
} 


function myParentFunc() { 
    //.... 
    myChildFunction(); 
} 

myChildFunction(); 
+0

Dies funktioniert nicht, bis Sie die Elternfunktion aufrufen. – SLaks

+0

Die zweite Instanz funktioniert ohne Aufruf der Elternfunktion. Treffen Sie Ihre Wahl und bestimmen Sie, was in Ihrer Situation am besten funktioniert. –

-1
function parentFunc() { 

    var childFunc = function() { 
     ... 
    } 

    ... 
} 

childFunc(); // works 
+2

Eigentlich nicht. – Tgr

+0

Dies funktioniert nicht, da JavaScript einen Funktionsumfang hat. childFunc ist nur innerhalb von parentFunc "sichtbar". – Stephano

+0

Danke, das wusste ich nicht. –

2

Möglicherweise möchten Sie mit der Yahoo Module Pattern stattdessen berücksichtigen:

myModule = function() { 

    //"private" variables: 
    var myPrivateVar = "I can be accessed only from within myModule." 

    //"private" methods: 
    var myPrivateMethod = function() { 
     console.log("I can be accessed only from within myModule"); 
    } 

    return { 
     myPublicProperty: "I'm accessible as myModule.myPublicProperty." 

     myPublicMethod: function() { 
      console.log("I'm accessible as myModule.myPublicMethod."); 

      //Within myModule, I can access "private" vars and methods: 
      console.log(myPrivateVar); 
      console.log(myPrivateMethod()); 
     } 
    }; 
}(); 

Sie definieren Ihre private Mitglieder, wo myPrivateVar und myPrivateMethod definiert sind, und Ihre öffentlichen Mitgliedern wo myPublicProperty und myPublicMethod definiert sind.

Sie können einfach die öffentlichen Methoden und Eigenschaften zugreifen, wie folgt:

myModule.myPublicMethod(); // Works 
myModule.myPublicProperty; // Works 
myModule.myPrivateMethod(); // Doesn't work - private 
myModule.myPrivateVar;  // Doesn't work - private 
+0

Sieht sehr interessant aus. Also, was ist der Code, um das zu machen, ohne die YUI-Bibliothek benutzen zu müssen? – CraigWl

+0

@CraigWl: Dieser Ausschnitt funktioniert so wie er ist. Ersetzen Sie einfach die Methoden und Eigenschaften durch sinnvolle Dinge. Du brauchst kein YUI. Es wird das YUI-Modul-Muster genannt, weil es zuerst von Yahoo für YUI verwendet wurde. –

2

Wenn Sie absolut nicht den Code ändern kann, gibt es keine Möglichkeit, es zu tun. Ansonsten weisen Sie die innere Funktion auf etwas können Sie zugreifen, indem Sie die Zeile ändern

function childFunc() { 

, sagen wir,

window.cf = childFunc() { 

dann können Sie die Funktion durch die cf Variable zugreifen. (Es gibt viele andere Möglichkeiten, dies zu tun; dies ist der, der die geringste Änderung im Code von Drittanbietern erfordert.)

+0

Wow, Sie sollten das Fensterobjekt nie ändern. Warum nicht einfach ein eigenes Objekt modifizieren? – Stephano

+0

Stephano, wissen Sie, dass Sie jedes Mal, wenn Sie eine globale Variable erstellen, zum Fensterobjekt hinzufügen, wie im obigen Beispiel? – rob

+0

Wenn JavaScript entscheidet, eines Tages alle globalen Variablen an einem anderen Ort zu speichern, was macht dieser Code? Es ist immer eine gute Form, Ihre Hände aus der Keksdose zu halten :). – Stephano

0

Hier ist, was Sie tun können:

die innere Funktion zur globalen anbringt:

function parentFunc() { 

    window.childFunc = function(){ 

    } 

} 

Dies ist eine Art Ghetto aber :)

Also ich würde einige der mehr verwenden ausgeklügelte OO-Muster, wie das Modul Muster:

function parentFunc() { 

    var someVar; 

    var childFunc = function(){ 

    }; 


    return { 
     childFunc, 
     someVar 
    } 

} 

parentFunc.childFunc(); 

Auf diese Weise können Sie yo zurückkehren Ihre innere Funktion und Ihr Rückgabewert.

Denken Sie daran, die Tatsache, dass Sie Ihre innere Funktion nicht nennen können, ist ein Merkmal von JS keine Einschränkung.

1

Es gibt einen Weg, dies sehr einfach zu tun, aber es ist auch eine sehr schlechte Praxis, sich darauf einzulassen. Da jedoch OCCATIONALLY globale Variablen nützlich sind, werde ich dies erwähnen. Bitte beachten Sie, dass in der Situation, die Sie beschreiben, kein gutes Beispiel für die Verwendung globaler Variablen ist.

Der folgende Code funktioniert, aber ist schrecklichen Code.

function parentFunction() { 
    ... 
    childFunction = function() { 
    ... 
    } 
} 

childFunction(); 

Sie machen childFunction global, was im Allgemeinen eine schreckliche Idee ist. Die Verwendung von Namespaces ist eine Möglichkeit, den globalen Variablenwahnsinn zu umgehen.

ABV = {}; 
ABV.childFunction = function() { 
    ... 
} 
ABV.parentFunction = function() { 
    ... 
    ABV.childFunction(); 
    ... 
} 
ABV.childFunction(); 

So funktionieren Bibliotheken wie DWR und so. Sie benutzen 1 globale Variable und setzen alle ihre Kinder in diese eine globale Variable.

Es ist sehr wichtig, darüber nachzudenken, wie der Scope in JavaScript funktioniert. Wenn Sie anfangen, globale Variablen herumzuschleudern, werden Sie in viele Schwierigkeiten geraten. Aus dem Beispiel, das Sie verwenden, ist klar, dass Sie etwas wie eine Klasse von "Funktionen" benötigen, die Sie von überall anrufen können. Ich hoffe, das hilft.

Verwandte Themen