2010-02-18 8 views
5

In Javascript gibt es eine Möglichkeit zum Erstellen einer Funktion aus einer Zeichenfolge (z. B. über den neuen Konstruktor Function()) und erben den übergeordneten Bereich? Zum Beispiel:Erstellen einer Funktion aus Zeichenfolge, die den übergeordneten Bereich erbt

(function(){ 
    function yay(){ 
    } 
    var blah = "super yay" 
    yay.prototype.testy = new Function("alert(blah)") 
    yay.prototype.hello = function(){alert(blah)} 
    whee = new yay(); 
    whee.hello() 
    whee.testy() 
})() 

Gibt es eine Möglichkeit whee.testy() auch alert "Super yay" zu machen?

+2

Gibt es einen Grund dafür, dass dies abgelehnt wurde? – cletus

+1

Ich glaube nicht, dass das möglich ist. – SLaks

+1

Ich denke, du solltest das nicht tun wollen. Wirklich, das könnte sehr gefährlich sein. Was ist der Zweck, eine Funktion aus einer Zeichenfolge zu erstellen? Was versuchst du zu erreichen? –

Antwort

1
(function(){ 
    function yay(){ 
    } 
    var blah = "super yay" 
    yay.prototype.testy = eval("(function(){alert(blah)})")//new Function("alert(blah)") 
    yay.prototype.hello = function(){alert(blah)} 
    whee = new yay(); 
    whee.hello() 
    whee.testy() 
})() 

Dies scheint für mich zu arbeiten, und keiner der eval'd Daten von jeder nicht vertrauenswürdigen Quelle. Es dient nur dazu, Code zu minimieren.

-1

Sie meinen eval?

(function(){ 
    function yay(){ 
    } 
    var blah = "super yay" 
    yay.prototype.testy = new Function(eval("alert(blah)")) // <--------------- 
    yay.prototype.hello = function(){alert(blah)} 
    whee = new yay(); 
    whee.hello() 
    whee.testy() 
})() 

Allerdings gibt es zwei moralisch verwerflich Merkmal von JS hier. 1) Eval ist "böse", und 2) der Code innerhalb der Eval kann die Variablen außerhalb sehen.

+0

'eval' ist ** böse **! Benutze es nicht! Nicht! –

+0

Und hier ist eine bessere Erklärung warum eval nicht zu verwenden: http://stackoverflow.com/questions/197769/when-is-avascripts-eval-not-evil/198031#198031 –

+0

Wie ich schon sagte: moralisch anstößig –

1

Eigentlich Kombination function und eval sollte das tun, was Sie wollen:

// blah exists inside the 'hello' function 
yay.prototype.hello = function(){ alert(blah) } 
// blah also exists inside the 'testy' function, and 
// is therefore accessible to eval(). 
yay.prototype.testy = function(){ eval('alert(blah)') } 
+0

Aber das OP muss ** sehr ** sicher sein, dass die Zeichenfolge keinen schädlichen Code enthält Ich bin daran interessiert, wie der String seinen Wert erhält –

+10

Ja, ja ... eval ist böse und all das. Gemessen an der Art und Weise, wie OP den anonymen erstellt hat funktionieren um seinen Code, es ist nicht sein erster Tag, der JS tut. – levik

+0

Ich benutze einfach Eval/Function, um etwas Code besser zu komprimieren, es sind keine Sachen, die vom Benutzer eingegeben werden, aber ich habe nur Code, wo es viele Funktionen mit sehr wenig Code gibt, Funktion (e) {var t = dies, return e (t)? [t]: []} und es gibt eine erhebliche Menge an Bytes, die mit der Funktion (e) aufgebraucht werden {var t = this; return}. – antimatter15

-1

Sie benötigen keine Bewertung.

Sie müssen die Blah mit der String-Funktion verketten, aber JavaScript wird sich beschweren, dass es kein ";" kurz vor der Verkettung liegt das daran, dass blah nur ein Text ist, wenn Sie ihn verketten. Sie haben zwei zu entkommen „\““um die Variable blah, um es wie ein String mit Text darin aussehen.

(function(){ 
    function yay(){ 
    } 
var blah = "super yay" 

yay.prototype.testy = new Function("alert(\""+blah+"\")") 
yay.prototype.hello = function(){alert(blah)} 
whee = new yay(); 
whee.hello() 
whee.testy() 
})() 

Diese‚Super-yay‘zwei Mal alarmiert!

+0

Aber wenn ich den Wert für "blah" aktualisiert, dann whee.testy() würde den falschen Wert alarmieren. – antimatter15

0

Der Grund warum whee.testy funktioniert nicht, weil Deklaration eine Funktion mit new Function("alert(blah)") die Funktion außerhalb der aktuellen Schließung schafft. da blah in Ihrem Verschluss definiert ist, Sie haben keinen Zugang zu ihm, und es wirft einen undefinierten Fehler.

Hier wird ein Proof of Concept Beispiel:

var blah = "global (window) scope"; 

(function(){ 
    function yay(){ 
    } 
    var blah = "closure scope"; 

    yay.prototype.testy = new Function("alert(blah)"); 
    yay.prototype.hello = function(){ alert(blah); } 
    whee = new yay(); 
    whee.hello(); 
    whee.testy(); 
})(); 
+0

Ich weiß, warum es nicht funktioniert, aber gibt es eine Möglichkeit, es zum Laufen zu bringen? – antimatter15

+0

@ antimatter15: Nein ... 'neue Funktion (String)' definiert eine Funktion im globalen Gültigkeitsbereich. Das ist Absicht. Verwenden Sie stattdessen anonyme Funktionen. –

1

Dies sollte Sie geben, was Sie wollen ...

var inputAction = "alert(blah)"; 
yay.prototype.testy = eval("(function(){ " + inputAction + "; })")

Es im Grunde Wraps innerhalb einer anonymen Funktion beabsichtigten Aktion, dies auf der eval vollständig ausgewertet wird, aber läuft nicht sofort, Es ist in eine Funktion verpackt.

Sie können hier ein wenig weiter gehen, aber ohne zu wissen, was Sie erreichen wollen, ist es schwer zu sagen.

Verwandte Themen