2014-01-13 20 views
8

Ich habe eine Schwierigkeit, eine Funktion innerhalb einer anderen Funktion aufgerufen wird, wenn sein Name in einer Variable ist:JavaScript-Aufruf Funktion innerhalb einer Funktion von Variablennamen

var obj = {} 

obj.f = function() { 
    var inner = { 
    a: function() { 
     function b() { 
     alert('got it!'); 
     } 
     b(); // WORKS AS EXPECTED 
     x = 'b'; 
     [x](); // DOESN'T WORK, NEITHER this[x]() window[x](), etc. 
    } 
    } 
    inner.a(); 
} 

obj.f(); 

Ich habe versucht [x]() mit unterschiedlichem Umfang Wegen prefixing aber so weit, ohne Erfolg. Die Suche nach vorhandenen Antworten ergab nichts. Es funktioniert mit this[x](), wenn b() direkt im Inneren des Objekts platziert ist. Ich möchte b() als Funktion innerhalb function a() wegen des variablen Bereichs in function a() behalten, andernfalls würde ich viele Parameter zu b() übergeben müssen.

//// Frage wiederholen: Quentin lieferte eine elegantere Antwort in diesem Thread imo.

+0

versuche 'window [x] .apply (this, [param1, param2])' [apply] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/ anwenden) – Catalin

+1

@RaraituL 'b' wird s sein fertig, so können Sie das nicht tun –

+0

@PaulS. Die Art und Weise, wie 'x' definiert ist, wird unter dem' window' Objekt – Catalin

Antwort

15

Es gibt keine sinnvolle Möglichkeit, auf eine beliebige Variable zuzugreifen, indem eine Zeichenfolge verwendet wird, die dem Namen der Variablen entspricht. (Für eine sehr schlechte Möglichkeit, dies zu tun, siehe eval).

[x](); // FUNKTIONIERT NICHT

Sie versuchen

WEDER this[x]()

Die Funktion kein ein Array als Funktion aufzurufen ist Eigenschaft des Objekts inner.

window[x]() usw.

Da es keine global ist, ist es nicht eine Eigenschaft des Fensters entweder Objekts.


Wenn Sie eine Funktion aufrufen, auf den Wert einer String-Variablen basiert, dann Funktionen in einem Objekt organisieren und darauf zugreifen aus, dass.

function b() { 
    alert('got it!'); 
    } 
    var myFunctions = { 
     b: b 
    }; 
    x = 'b'; 
    myFunctions[x](); 
+0

var myFunctions = { b: b }; Das hat es geschafft! – Gonki

3

Versuchen Sie dies. Derzeit weisen Sie der Variablen x anstelle einer Funktionsvariablen einen String zu.

x = b; 
x(); 
+0

vielleicht hätte es funktionieren können, wenn der Wert b direkt zugewiesen wäre. es kommt von einer Berechnung. Im Beispiel ist das kein echter Code. – Gonki

1

Die Funktionsdeklarationb wird in der Schließung der anonymous Funktionsausdruck alsa zugeordnet erfasst werden.

  1. Wenn var in einem Verschluss verwendet wird, gibt es keine (erhältlich in JavaScript) Objekt, die eine Eigenschaft ähnlich dem, was passiert mit window im globalen Scope zugewiesen wird.
  2. Eine Funktionsdeklaration effektiv schreiben var s die Name der Funktion.

Wenn Sie wirklich eine Variable zugreifen möchten (dh b) durch String, müssen Sie entweder ein Objekt schaffen, die zu b ähnlich hält, was Sie für a getan haben, oder (und möglicherweise gefährlich) auf eval angewiesen, um "b" zu b zu konvertieren.

Wenn Sie die ganze Objekt nicht erstellen kann Voraus-Zeit können Sie dieses Format verwenden

/* in (higher?) scope */ 
var fnRef = {}; 
// now when you 
function b() {/* define as desired */} 
// also keep a ref. 
fnRef['b'] = b; 
// fnRef['b']() will work **after this line** 
1

sagen wir mal der Code wie folgt lautet:

//instead of x = 'b' 
x = function(){} 

dann Lösung könnte so sein:

var obj = {} 

obj.f = function() { 
    var inner = { 
    a: function() { 
     function b() { 
     alert('got it!'); 
     } 
     b(); // WORKS AS EXPECTED 
     //you can define it as a variable 
     var x = function(){}; 
     //and call it like this 
     x(); 

     //or define it like this 
     this[x] = function(){}; 
     //and call it like this 
     this[x](); 

     //but you are creating an array [x] which is not a function 
     //and you are trying to call an array???? 
     [x](); // DOESN'T WORK, NEITHER this[x]() window[x](), etc. 
    } 
    } 
    inner.a(); 
} 

obj.f(); 
2

Das Problem ist mit Ihrem als signierung

Verwenden Sie x = b anstelle von x = 'b', um das Funktionsobjekt zuzuweisen, da letzteres die Zeichenfolge nur x zuweist.

Sobald Sie Ihre Zuordnung zu beheben können Sie die Funktion als

x(); 
a.x(); 
a[x](); 

usw. aufrufen

+0

müssen Sie 'a [x]()' in 'a [" x "]();' ändern, es sei denn, x ist eine String-Variable mit einem "x" -Wert. –

2

Sie Array für die Funktion machen sollte und Zugriff dann in Ihre Variable wie folgt mit Name:

var obj = {} 

obj.f = function() { 
    var inner = { 
    a: function() { 
     // set up the possible functions: 
     var myFuncs = { 
       b: function b() {alert('got it!');} 
       }; 
     //b(); // WORKS AS EXPECTED --> commented this code 
     x = 'b'; 
     myFuncs[x]();  
    } 
    } 
    inner.a(); 
} 
+0

@Gonki Sie benötigen minimale Änderungen in Ihrem Code für diese Lösung –

Verwandte Themen