使用eval的Javascript函数赋值

JDo*_*ong 1 javascript eval lvalue

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

function fSwap(funcName, code) {
    eval(funcName) = eval(code);
}
fSwap("drawScene", "function drawScene() { /* Do something */ }");
Run Code Online (Sandbox Code Playgroud)

我觉得这应该工作,但由于某种原因eval(funcName)不是左值,它返回错误ReferenceError: invalid assignment left-hand side.更令人费解的是:

var a = function test() {return 0;};
alert(a === eval("a"));
eval("a") = function test() {return 1;};
Run Code Online (Sandbox Code Playgroud)

提供警报,true但不允许我分配给该功能a.

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

Joe*_*e50 6

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

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

要直接回答您的问题,出现的问题是您为评估的代码片段分配了一个值.那不行.会有什么工作:

function fSwap(funcName, code) {
    eval(funcName+' = '+code);
}
Run Code Online (Sandbox Code Playgroud)

但请不要这样做.另一种方式,使用回调函数,更清洁.几乎总是最好不要在eval不是绝对需要的时候使用它.(根据你的评论,显然绝对需要使用字符串,所以请使用这段代码).