我使用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转换为函数然后存储到句柄键。
答案 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();
}
另外,为了帮助减少访问window
或document
等对象的风险,您可以在函数范围内创建新变量来创建该函数。例如:
// 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