2017-01-27 4 views
0

Beachten Sie Folgendes:Dynamisch Aufruf Konstruktor von IIFE

function windowTest() { } 

(function() { 
    function test() { } 

    var test1 = new test(); // Works fine. 
    var test2 = new window["windowTest"](); // Works since windowsTest is declared globally. 
    var test3 = new window["test"](); // Fails since in an IIFE. 

    // How can I create a testObj if I only have the string "test"? 
})(); 

Grundsätzlich möchte ich ein Objekt, dessen Funktion erstellen wurde in einem IIFE erklärt.

+1

Re 'test3' : Warum müssen Sie auf diese Funktion auf dem 'window' Objekt zugreifen, anstatt es direkt zu benutzen? –

+1

Warum funktioniert der neue test() nicht? –

+0

test() funktioniert tatsächlich, aktualisiert den Kommentar. – smulz

Antwort

2

Der Grund

var test3 = new window["test"](); 

versagt, weil test nicht global deklariert wurde. Wenn Sie auf Elemente zugreifen möchten, die direkt in der IIFE deklariert sind, können Sie, wie Sie wissen, auf sie über ihren Namen zugreifen.

new test(); 

Eine andere Möglichkeit ist Ihre Funktion innerhalb einer Art von Objekt zu speichern dann das Objekt zuzugreifen, wie Sie mit window tat. Dies ist fast immer die Lösung für diese Art von Problemen.

(function() { 
 
    var context = { 
 
    test: function() { 
 
     console.log('new test'); 
 
    } 
 
    }; 
 
    
 
    var test = new context['test'](); 
 
})();

Die letzte Art und Weise verwendet eval. eval ist fast immer a really bad idea. Wirklich, es sollte vermieden werden, es sei denn, Sie missbrauchen die Sprache nur aus Interesse. Aber Sie können in diesem Fall verwenden.

(function() { 
 
    function test() { 
 
    console.log('new test'); 
 
    } 
 
    
 
    var test = eval('new test()'); 
 
})();

1

können Sie this verwenden, wie so:

(function() { 
    this.test = function() {} 
    console.log(this["test"]()) 
})() 

Oder verwenden Sie eine separate Variable:

(function() { 
    var foobar = { 
     test: function() { } 
    }; 
    console.log(foobar["test"]()) 
})(); 
+2

Hinweis: Die Verwendung von 'this' wird fehlschlagen, wenn im strikten Modus ausgeführt wird, da' this' nicht definiert ist. Im nicht strikten Modus werden dem globalen Objekt Werte hinzugefügt. –

1

Sie können Ihre Funktionen diese binden:

function(){ 
//your code using 
this.test("Hi"); 
this["test"]("Hi"); 
}.call({ 
//function declarations: 
test:window.alert, 
}); 

Noch ein IIFE so wird es nicht im globalen Kontext arbeiten:

this.test("Hi");//reference Error