2016-03-23 35 views
2

Ich konvertierte eine Funktion in String mit stringify und in der Datenbank gespeichert. Aber wie diese Zeichenfolge als Funktion einer VariablenWie konvertiert man einen String in JavaScript?

hinzufügen lässt i String bekommen annehmen wie ich in einem

var A = "function aF() {\n console.log(\'change1\');\n}" 

Ich möchte mich zeigt aF-Funktion auf einen Objektschlüssel wie diese

{handle: A } 
hinzufügen

Aber ich bin immer dies in Folge

{ handle: 'function aF() {\n console.log(\'change1\');\n }' } 

stattdessen möchte ich diese

{handle:[function: aF]} or {handle:[function]} 

Weil die Variable A die Zeichenfolge typeof ist. Gibt es eine Möglichkeit, A in Funktion zu konvertieren und dann in Handle-Schlüssel zu speichern.

+1

können Sie eval verwenden, Zeichenfolge zu konvertieren wie eval ('Funktion asd() {}') –

+2

Sie können auch [die Funktion nutzen funktionieren() Konstruktor] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function). –

+0

Können Sie JSON.stringify verwenden? Dann können Sie JSON.parse verwenden. –

Antwort

0

Heres, wie ich es tun würde, diese ist so ziemlich eine andere Antwort auf andere s aber beinhaltet keine Sub-Strings. Die Kommentare zum Code sagen alles.

var yourExample = createFunction("function aF() {\n console.log(\'change1\');\n}"); 
yourExample(); // prints change1 in console 

var fnWithParam = createFunction("function aF(param1) { console.log(param1); }"); 
fnWithParam(2); // prints 2 in console 


// creates a function from a string, that string must be a function itself. 
function createFunction(fnStr) { 
    // make a function which returns a function, unwrap that function by calling it with apply(); 
    return new Function('return ' + fnStr).apply(); 
} 

Auch die Gefährdung durch den Zugriff auf Objekte zu reduzieren, wie window oder document Sie neue Variablen innerhalb des Funktionsumfangs, die diese Funktion schafft erstellen können. Zum Beispiel:

// creates a function from a string, that string must be a function itself. 
function createFunction(fnStr) { 
    // make a function which returns a function, unwrap that function by calling it with apply(); 
    return new Function('"use strict"; var window,document; return ' + fnStr).apply(); 
} 

Jetzt löst dies nicht alle Sicherheitsprobleme rund um die Erstellung von Javascript aus Strings, aber ich denke, es ist besser als nichts.

Gute Lesungen:

"use strict"; - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

new Function() - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function

+0

Danke, das funktioniert gut. – Rishi

3

Sie können den Funktionskonstruktor verwenden, um Funktionen zu erstellen.

Zum Beispiel.

var A = "function aF() {\n console.log(\'change1\');\n}" ; 
var functionStr = A.substring(A.indexOf("{")+1, A.lastIndexOf("}")); 
new Function(functionStr)(); 

Hinweis:

einen String Mit function Objekt mit dieser Methode zu schaffen, ist so riskant wie eval(). Sie sollten es nicht tun, wenn Sie nicht sicher sind, dass die Benutzereingabe nicht beteiligt ist. Wenn eine Benutzereingabe verwendet wird, um eine Zeichenfolge function zu erstellen, wird die Funktion nicht als sicher betrachtet, da der Benutzer möglicherweise die Authentifizierung und Autorisierung manipulieren kann, da das System diese nicht steuern (validieren) kann.

was ist, wenn Funktion aF haben einige Parameter

Sie müssen den Verweis auf die Funktion Objekt speichern und das gleiche mit Parameter aufrufen, zum Beispiel

var A = "function aF() {\n console.log(\'change1\');\n}" ; 
var functionStr = A.substring(A.indexOf("{")+1, A.lastIndexOf("}")); 
var functionObj = new Function(functionStr); 

nun diese Funktion aufrufen, mit Parameter, zum Beispiel

functionObj (args); 

oder verwenden call

functionObj.call(this, args);//this is the context you want to bind to this funciton. 

oder apply

functionObj.apply(this, args);//this is the context you want to bind to this funciton. 
+3

@ScottMarcus: Während das alles wahr ist, wenn Sie ** tun müssen, was das OP beschreibt (drehen Sie einen String, der die Funktion enthält, in eine tatsächliche Funktion), müssen Sie dies tun (oder 'eval', oder erstellen Sie ein Skript-Tag oder ähnliches - die die gleichen Probleme haben. Die Fehler der Frage sind nicht die Schuld der Antwort.:-) –

+0

@ gurvinder372 was ist, wenn die Funktion aF einen Parameter hat. – Rishi

+0

@Rishi: Hier ist ein Beispiel mit eval + Parameter https://jsfiddle.net/1z1sjh5n/. Ich bin mir nicht sicher, wie man das erreichen kann, wenn man den neuen Function-Prototyp verwendet, um ganz ehrlich zu sein. (Auch, bitte, nächstes Mal in Ihrer Frage klarstellen, dass Sie eval Probleme kennen und so weiter;)) – briosheje

0

Eine andere Lösung wäre zu tun verwenden:

var A = "function aF() {\n console.log(\'change1\');\n}" ; 
eval(A); 
{handle:aF} 
0

Guten Tag.

Ich schrieb kleine Funktion. Es ist sehr einfach, ohne viele Validierungen. Siehe hier

function makeFooFromString(str){ 
    var m = str.match(/function\s+([^(]+?)\s*\(([^)]*)\)\s*{(.*)}/); 
    // function name 
    var fooname = m[1]; 

    // function params 
    var params = m[2]; 

    // function body 
    var body = m[3]; 

    // processing params 
    if(params.length){ 
     params = params.split(','); 
     for(var i = 0; i < params.length; i++){ 
      params[i] = params[i].replace(/\s*/, ''); 
     } 
    }else{ 
     params = []; 
    } 

    params = params.join(','); 

    // make our temp function body 
    var text = ''; 
    text += 'var foo = function('+params+'){'+body+'};'; 
    text += 'return foo.apply(foo, arguments);';  
    return new Function(text); 
}; 

Jetzt mache ich Aufruf wie diese

var foo = makeFooFromString('function get_sum(a, b){ return a+b;}') 

und Test

console.log(foo); 
console.log(foo(1, 2)); 
console.log(foo(3, 4)); 

es Siehe auf jsfiddle https://jsfiddle.net/j586xajq/

Verwandte Themen