Wie bekomme ich das "scope" einer anonymen JavaScript-Funktion?

8

Nehmen wir an, ich bekomme eine anonyme Funktion, die notwendig ist, auf ihren Kontext zu reagieren, aber es ist anders, ob sie an "Fenster" oder ein unbekanntes Objekt gebunden ist.

Wie bekomme ich einen Verweis auf das Objekt, von dem eine anonyme Funktion aufgerufen wird?

BEARBEITEN, ein wenig Code:

%Vor%

Sie könnten legitim fragen, warum wollen Sie so etwas tun? Nun, ich wollte zuerst Argumente übergeben, die als Array übergeben wurden. Genau wie der Operator " * " von Python:

%Vor%

Ich grub mich in SO und fand einen Beitrag um "apply ()" zu verwenden:

%Vor%

Interessant, da das aktuelle "this" in einem Objekt verwendet wird, und "window" wenn nicht.

Aber ich denke, es gibt ein Problem:

Wenn "bar ()" selbst in einem Objekt ist, dann bezieht sich "dies" auf den "bar ()" Container, daher wird es nicht funktionieren.

BTW, Ich möchte den Gültigkeitsbereich nicht als Parameter übergeben .

Ich kann natürlich die Argumente und die Funktion als String verketten und dann eval verwenden, aber ich möchte das nur verwenden, wenn ich etwas saubereres nicht finden kann.

Natürlich, wenn es nur unmöglich ist (schließlich könnte es sein), dann mache ich:

%Vor%

EDIT 2: vollständiges Szenario, wie in Kommentaren gefragt.

Ich verwende qunit, um Komponententests in Javascript durchzuführen. Es ist cool, aber ich vermisse einen Weg zu überprüfen, ob etwas eine Ausnahme auslöst.

Der grundlegendste Test ist so gemacht:

%Vor%

Die Idee ist, etwas wie:

zu machen %Vor%

Wenn ich Eval loswerden könnte, wäre es großartig. Und warum möchte ich den Scope nicht als Parameter verwenden? Weil Sie vielleicht einen Container, der auf 20 Funktionen mit unterschiedlichen Gültigkeitsbereichen verweist, in Schleife durchlaufen lassen und sie alle in der Schleife testen möchten, anstatt das Zeug von Hand zu schreiben.

    
e-satis 11.10.2009, 14:11
quelle

1 Antwort

6

e-satis,

Die einzige Möglichkeit ist, die Methode call or apply zu verwenden, um den richtigen Kontext zu setzen.

Um Ihr Problem zu lösen, ändern Sie Ihre Balkenfunktion, um die Rückruffunktion zu akzeptieren, sowie den Bereich, der auf diese Callback-Funktion angewendet werden soll.

%Vor%

Alternativ können Sie eine 'bind' Methode verwenden.

%Vor%

Nun können Sie Ihre Balkenfunktion unverändert lassen und den aufrufenden Code so ändern,

zu sehen %Vor%

BEARBEITEN:

Wie ich im Kommentar bemerkt habe, liegt es in der Verantwortung des aufrufenden Codes, eine korrekte Rückruffunktion zu übergeben. Ihre 'Bar' Funktion kann nicht bestimmen, welchen Umfang zu verwenden, Punkt.

Nehmen Sie dies als Beispiel,

%Vor%

Wie werden Sie herausfinden, was der Bereich sein sollte? Es gibt nichts, was Sie jetzt analysieren können, und es gibt keine Möglichkeit, Ihre "Balken" -Funktion so zu ändern, dass dies funktioniert.

    
SolutionYogi 11.10.2009 14:36
quelle