如何在javascript中将字符串转换为函数?

时间:2016-03-23 14:27:26

标签: javascript

我使用stringify将函数转换为字符串并存储到数据库中。 但是如何将此字符串作为函数添加到变量

让我假设我得到的字符串就像我在A

中显示的那样
git clone https://github.com/zurb/foundation-sites-template projectname

我想将aF函数添加到像这样的对象键

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

但我在结果中得到了这个

{handle: A }

相反,我想要这个

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

因为变量A是typeof string。有没有办法将A转换为函数然后存储到句柄键。

4 个答案:

答案 0 :(得分:3)

您可以使用Function构造函数来创建函数。

例如。

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

注意:

使用字符串通过此方法创建function对象与eval()一样具有风险。除非您确定不涉及用户输入,否则不应该这样做。如果在创建function字符串时使用了用户输入,那么函数不被认为是安全的,因为用户可能会围绕身份验证和授权进行操作,因为系统无法控制(验证)该函数。

  

如果函数aF有一些参数

怎么办?

您需要存储对函数对象的引用,并使用参数调用相同的引用,例如

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

现在使用参数调用此函数,例如

functionObj ( args );

或使用call

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

或使用apply

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

答案 1 :(得分:0)

另一种解决方案是:

import signal
import daemon
import lockfile

import manager

context = daemon.DaemonContext(
    working_directory='/home/debian/station',
    pidfile=lockfile.FileLock('/var/run/station.pid'))

context.signal_map = {
    signal.SIGTERM: manager.Manager.program_terminate,
    signal.SIGHUP: 'terminate',
    signal.SIGUSR1: manager.Manager.program_reload_configuration,
    }

manager.Manager.program_configure()

with context:
    manager.Manager.program_start()

答案 2 :(得分:0)

美好的一天。

我写了小函数。 它很简单,没有很多验证。 见这里

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);
};

现在我这样打电话

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

并测试

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

在jsfiddle上看到它 https://jsfiddle.net/j586xajq/

答案 3 :(得分:0)

继承人如何做到这一点,这是对其他回复的另一种看法,但不涉及任何子字符串。对代码的评论几乎都说明了。

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();
}

另外,为了帮助减少访问windowdocument等对象的风险,您可以在函数范围内创建新变量来创建该函数。例如:

// 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();
}

现在这并没有解决从字符串创建javascript的所有安全问题,但我认为它总比没有好。

好读数:

"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