Na przykład;
var s = "function test(){
alert(1);
}";
var fnc = aMethod(s);
Jeśli to jest ciąg, chcę funkcję o nazwie fnc. I fnc();
wyskakuje ekran ostrzegawczy.
eval("alert(1);")
nie rozwiązuje mojego problemu.
javascript
string
function
ymutlu
źródło
źródło
Lepszym sposobem na utworzenie funkcji z łańcucha jest użycie
Function
:Ma to tę zaletę / wadę, że zmienne w bieżącym zakresie (jeśli nie są globalne) nie mają zastosowania do nowo skonstruowanej funkcji.
Możliwe jest również przekazywanie argumentów:
źródło
Function
nie zanieczyszczasz zakresu lokalnego i dlategoeval
optymalizacja jest tak trudna dla silników ... Na przykładzie OP:var fnc = Function('return '+s)();
element.onclick = function() { alert("test"); }
.Jesteś całkiem blisko.
Oto działające skrzypce .
źródło
eval
ostrzeżenie dla przyszłych poszukiwaczy:eval
może otwierać luki dla hakerów: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ... ale jeśli znasz niebezpieczeństwa i potrafisz ich uniknąć, to jest to prosty sposób utwórz funkcję z łańcuchaTak, używanie
Function
jest świetnym rozwiązaniem, ale możemy pójść trochę dalej i przygotować uniwersalny parser, który parsuje ciąg i konwertuje go na prawdziwą funkcję JavaScript ...przykłady użycia:
tutaj jest jsfiddle
źródło
Dynamiczne nazwy funkcji w
JavaScript
Za pomocą
Function
Źródło: http://marcosc.com/2012/03/dynamic-function-names-in-javascript/
Za pomocą
eval
Za pomocą
sjsClass
https://github.com/reduardo7/sjsClass
Przykład
źródło
Ta technika może być ostatecznie równoważna metodzie eval, ale chciałem ją dodać, ponieważ może być przydatna dla niektórych.
Funkcjonalnie jest to podobne do dodania tego elementu <script> na końcu dokumentu, np .:
źródło
Użyj
new Function()
z powrotem do środka i wykonaj go natychmiast.źródło
Przykład z dynamicznymi argumentami:
źródło