使用eval的Javascript函数赋值

时间:2014-02-08 18:18:24

标签: javascript eval lvalue

我无法重新分配功能。我想分配一个先前定义的函数,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(),以便它接收两个字符串并将代码分配给给定的函数名?

2 个答案:

答案 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