我无法重新分配功能。我想分配一个先前定义的函数,drawScene
一个不同的方法。
function fSwap(funcName, code) {
eval(funcName) = eval(code);
}
fSwap("drawScene", "function drawScene() { /* Do something */ }");
我觉得这应该有用,但由于某种原因eval(funcName)
不是左值,它会返回错误ReferenceError: invalid assignment left-hand side
。更令人费解的是:
var a = function test() {return 0;};
alert(a === eval("a"));
eval("a") = function test() {return 1;};
通过true
发出提醒,但不允许我分配给a
功能。
我唯一的猜测是,出于安全原因,eval()不返回左值。如果是这样,我如何实现fSwap(),以便它接收两个字符串并将代码分配给给定的函数名?
答案 0 :(得分:6)
您应该使用回调函数。你可以这样做:
function fSwap(funcName, callback) {
window[funcName] = callback;
}
fSwap("drawScene", function drawScene() { /* Do something */ });
要直接回答您的问题,出现的问题是您为评估的代码片段分配了一个值。那不行。会有什么用的:
function fSwap(funcName, code) {
eval(funcName+' = '+code);
}
但请不要这样做。另一种方式,使用回调函数,更清洁。每当不是绝对需要使用它时,最好不要使用eval
。 (根据your comment,显然绝对需要使用字符串,所以请使用这段代码。)
答案 1 :(得分:0)
我迟到了,但以下内容适用于将用户输入字符串作为函数。
var foo=function(){alert("foo");};
foo();//alerts 'foo'
function fSwap(funcName, fn) {
eval("newfunc = "+fn);
window[funcName] = newfunc;
}
fSwap("foo","function(){alert('bar');}");
foo();//alerts 'bar'
DEMO:jsbin