使用 eval 的 Javascript 函数赋值

标签 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() 以便它接收两个字符串并将代码分配给给定的函数名称?

最佳答案

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

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

要直接回答您的问题,问题在于您正在为一段已评估的代码分配一个值。那行不通的。什么会起作用:

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

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

关于使用 eval 的 Javascript 函数赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21649928/

相关文章:

javascript - jQuery - SlideToggle 从中间开始并向左和向右出去

javascript - window.print 在 IE 和 Chrome 中打印不同的 URL?

javascript - eval() 和全局范围

javascript - 不使用 eval 迭代 json 对象?

javascript - 如何在 Marionette ItemView 中更新的集合中的对象上运行 toJSON?

javascript - $(this) 和 event.target 不同但应该相同

c++ - 为什么文字和临时变量不是左值?

metaprogramming - 使用 `FALLBACK` 时如何知道是否返回左值?

perl - 我可以在 Perl 中的硬编码地址处调用子程序吗?

c++ - 将临时对象作为 LValues 传递