Frage

Ich arbeite an einem JavaScript-Framework. Ich habe mehrere unabhängige Skripte, die wie folgt aussehen:

core.modules.example_module = function(sandbox){
    console.log('wot from constructor ==', wot);

  return{
    init : function(){
      console.log('wot from init ==', wot);
    }
  };
};

wird diese Funktion von einem anderen externen Skript aufgerufen. Ich versuche, Variablen in dieser Funktion zu übergeben, damit sie zugegriffen werden kann without using the this keyword.

Das obige Beispiel Fehler aus wird sagen wot nicht definiert ist.

Wenn ich die Funktion in einer anonymen Funktion wickeln und die Variablen deklariert dort bekomme ich die erwarteten gewünschten Ergebnisse

(function(){

var wot = 'omg';

core.modules.example_module = function(sandbox){
    console.log('wot from creator ==', wot);

  return{
    init : function(){
      console.log('wot from init ==', wot);
    }
  };
};

})();

Was ich versuche zu tun, um die Variablen weiter oben in der Scope-Chain erklären, so dass sie ohne das dieses Schlüsselwort wie das zweite Beispiel im Modul zugegriffen werden. Ich glaube nicht, das möglich ist, da es wie die Funktionen Ausführung sieht Umfang auf Erklärung der Funktion abgedichtet ist.

update
Um zu klären, wo ich wot zu definieren versuchen. In einer separaten JavaScript-Datei habe ich ein Objekt, das eine Register Modulfunktion wie diese

ruft
core = function(){
   var module_data = Array();
   return{
    registerModule(){
      var wot = "this is the wot value";
      module_data['example_module'] = core.modules.example_module();
    }
  };
};
War es hilfreich?

Lösung

Was Sie suchen heißt „ dynamischen Scoping “, wo Bindungen gelöst werden durch die aktuelle Anruf-Kette zu suchen. Es ist nicht allzu häufig außerhalb der Lisp-Familie (Perl unterstützt, über das local Schlüsselwort). Dynamische Scoping ist nicht in JS unterstützt, die verwendet lexikalischen Scoping .

Andere Tipps

Betrachten Sie dieses Beispiel, Ihren Code mit

var core = {}; // define an object literal
core.modules = {}; // define modules property as an object

var wot= 'Muhahaha!';

core.modules.example_module = function(sandbox){

  console.log('wot from creator ==', wot);

  return {
    init: function() {
       console.log('wot from init ==', wot);

    }
  }
}

// logs wot from creator == Muhahaha! to the console    
var anObject = core.modules.example_module(); 

// logs wot from init == Muhahaha! to the console
anObject.init(); 

Solange wot irgendwo in dem Scope-Chain für core.modules.example_module an dem Punkt definiert, bei der es ausgeführt wird, wird dies wie erwartet.

Ein wenig off topic, aber Sie haben auf den Funktionsumfang berührt. Funktionen haben lexikalischen Gültigkeitsbereich, das heißt sie ihren Umfang an der Stelle schaffen, an die sie definiert ist (im Gegensatz zu Gegensatz ausgeführt) und ermöglicht die Verschlüsse geschaffen werden; Ein Verschluss entsteht, wenn eine Funktion hält einen Link zu ihrem übergeordneten Rahmen, auch nachdem die Eltern zurückgekehrt sind.

Putting var wot; am Anfang Ihres Konstruktor sollte es tun

core.modules.example_module = function(sandbox){
  var wot;
  wot = 'foo'; //just so you can see it working
  console.log('wot from constructor ==', wot);

  return{
    init : function(){
      console.log('wot from init ==', wot);
    }
  };
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top