2016-06-27 12 views
0

Dies ist nicht verwandt mit this als solche func.apply und func.call nicht zutreffend (kein Wortspiel beabsichtigt).Wie übergebe ich einen nicht 'diesen' Kontext an eine Funktion

Ich muss den aktuellen Kontext einer Funktion an eine andere Funktion übergeben, mit der ich meine, ich brauche Zugriff auf die genannten lokalen Variablen innerhalb einer Funktion.

hier ist ein etwas konstruiertes Beispiel:

function doSomething(f){ 
    eval(f) 
} 
function test(callback){ 
    doSomething("callback.apply(1, 2)") 
} 
test(function(a, b){ 
    console.log(a + b); 
}) 

Wie kann ich die lokale Variable übergeben callback zu doSomething so ist es eval vorhanden - ich erkenne dies ein konstruiertes Beispiel ist. Ist das überhaupt möglich?

Ich weiß, dass verschachtelte Kontexte übertragen werden, also wenn ich doSomething innerhalb test erklären würde, würde dies einfach funktionieren. Aber das hilft mir nicht.

+0

zuerst dachte ich, dass es möglich war, den übergeordneten Kontext zugreifen, aber [es ist nicht] (http: // Stackoverflow. com/questions/6332017/how-to-get-diesen-Wert-der-Aufrufer-Funktion). Warum gibt es ein Problem, das "this" an die Funktion weitergibt? Sollte ein globaler Stapel von Kontexten für Ihr Problem funktionieren? – Wikiti

+0

Was ist dein tatsächliches Problem? Nein, es ist niemals möglich, auf beliebige Funktionskontexte zuzugreifen. – Bergi

+0

Werfen Sie einen Blick auf [dieses Snippet] (http://stackoverflow.com/a/24032179/1048572), die eine Form von Eval verwendet, die auch erlaubt, bestimmte Dinge in den Testbereich – Bergi

Antwort

1

Wenn Sie wirklich verwenden eval wollen ... Sie ein IIFE im String-Format erstellen können, und übergeben Sie in den Argumenten, dass man fast den Weg wollen Sie es, bevor Sie wurden:

function doSomething(f) { 
 
    eval(f) 
 
} 
 

 
function test(callback) { 
 
    doSomething('(' + callback.toString() + ')(1, 2)'); 
 
} 
 

 
test(function(a, b) { 
 
    console.log(a + b); 
 
})

+0

Cleveres Work-around. Dies ist im Grunde, was Browser-Treiber wie phantom.js und Selen tun. – slebetman

+0

das würde für den spezifischen Fall funktionieren - aber nicht den allgemeinen Fall. Ich hätte in meiner Frage generischer sein sollen - siehe obigen Kommentar. –

-1

binden arbeiten für u

function doSomething(f){ 
    eval(f()); 
} 
function test(callback){ 
    doSomething(callback.bind(null,1,2)) 
} 
test(function(a, b){ 
    console.log(a + b); 
}) 
+0

Das verwendet 'f()', nicht 'eval (f)' – Bergi

Verwandte Themen