使用eval的Javascript函数赋值

使用eval的Javascript函数赋值,javascript,eval,lvalue,Javascript,Eval,Lvalue,我无法重新分配功能。我想为先前定义的函数,drawsecene分配一个不同的方法 function fSwap(funcName, code) { eval(funcName) = eval(code); } fSwap("drawScene", "function drawScene() { /* Do something */ }"); 我觉得这样应该行得通,但由于某种原因,eval(funcName)不是左值,它返回错误ReferenceError:invalid assignm

我无法重新分配功能。我想为先前定义的函数,
drawsecene
分配一个不同的方法

function fSwap(funcName, code) {
    eval(funcName) = eval(code);
}
fSwap("drawScene", "function drawScene() { /* Do something */ }");
我觉得这样应该行得通,但由于某种原因,
eval(funcName)
不是左值,它返回错误
ReferenceError:invalid assignment left-side
。更令人费解的是:

var a = function test() {return 0;};
alert(a === eval("a"));
eval("a") = function test() {return 1;};
发出带有
true
的警报,但不允许我将其分配给函数
a


我唯一的猜测是,出于安全原因,eval()不返回左值。如果是这样,我如何实现fSwap(),使其接受两个字符串并将代码分配给给定的函数名?

您应该改用回调函数。您可以这样做:

function fSwap(funcName, callback) {
    window[funcName] = callback;
}
fSwap("drawScene", function drawScene() { /* Do something */ });

要直接回答您的问题,问题在于您正在为一段经过评估的代码赋值。那不行。工作将是:

function fSwap(funcName, code) {
    eval(funcName+' = '+code);
}

但请不要这样做。另一种方法是使用回调函数,更简洁。几乎总是最好不要使用
eval
,只要不是绝对需要使用它。(根据,显然必须使用字符串,所以一定要使用这段代码)。

您应该使用回调函数。您可以这样做:

function fSwap(funcName, callback) {
    window[funcName] = callback;
}
fSwap("drawScene", function drawScene() { /* Do something */ });

要直接回答您的问题,问题在于您正在为一段经过评估的代码赋值。那不行。工作将是:

function fSwap(funcName, code) {
    eval(funcName+' = '+code);
}

但请不要这样做。另一种方法是使用回调函数,更简洁。几乎总是最好不要使用
eval
,只要不是绝对需要使用它。(根据,显然使用字符串是绝对必要的,所以一定要使用这段代码)。

我来晚了,但以下内容应该可以用于将用户输入字符串作为函数

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'

演示:

我参加聚会迟到了,但以下内容应该可以用于将用户输入字符串作为函数

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'

演示:

为什么不使用
drawsecene=function(){/*做点什么*/},根本不需要求值?我想使用用户输入的字符串来分配函数
,根本不需要eval?我想使用用户输入的字符串来分配函数。fSwap的两个参数都是字符串,您的第一个代码段是否仍然有效?@JDong第二段代码(使用
eval
)确实可以使用输入的两个字符串。第一个代码要求第二个参数是函数。如果绝对要求两个参数都是字符串,则使用第二个代码。那就行了。不幸的是,我必须使用eval()。如果有更好的方法来获取用户输入函数并将其分配给代码,我仍然洗耳恭听。@JDong,对于这种情况(当函数的源代码是外部的)eval是可以的。只是当它在您这边时不要误用它,您可以将它作为常规函数编写。@JDong如果您运行的是用户提供的代码,那么您将需要使用eval,但请记住,您应该只为用户自己使用它。切勿让用户提供的代码为用户自己以外的任何用户运行,以防止出现重大安全问题。fSwap的两个参数都是字符串,您的第一个代码段是否仍然有效?@JDong第二个代码块(使用
eval
)确实可以使用输入的两个字符串。第一个代码要求第二个参数是函数。如果绝对要求两个参数都是字符串,则使用第二个代码。那就行了。不幸的是,我必须使用eval()。如果有更好的方法来获取用户输入函数并将其分配给代码,我仍然洗耳恭听。@JDong,对于这种情况(当函数的源代码是外部的)eval是可以的。只是当它在您这边时不要误用它,您可以将它作为常规函数编写。@JDong如果您运行的是用户提供的代码,那么您将需要使用eval,但请记住,您应该只为用户自己使用它。切勿让用户提供的代码为用户自身以外的任何用户运行,以防止出现重大安全问题必要吗?我感觉像
eval(funcName+'='+code)
可能是一个更好的解决方案,因为它不创建临时变量。@JDong是的,你是对的。在我的脑海中,我认为使用
window[funcName]
会限制用户只替换已经存在的函数。经过检查,我意识到这是胡说八道;)是
窗口[funcName]=newfunc必要吗?我感觉像
eval(funcName+'='+code)
可能是一个更好的解决方案,因为它不创建临时变量。@JDong是的,你是对的。在我的脑海中,我认为使用
window[funcName]
会限制用户只替换已经存在的函数。经过检查,我意识到这是胡说八道;)