javascript - 使用 eval 从字符串创建函数的不同方法

标签 javascript eval

是的,我知道 eval 是邪恶的,但是......

我很少看到一个函数是通过几种不同的方式从字符串创建的:

var s = "function fname() { this.m = function(s){alert(s);}}";

//1
var x = new( eval("("+s+")") );
x.m("aaa")

//2
var x = new( eval('[' + s + ']')[0] );
x.m("bbb")

//3
var x = new ( eval(s + " fname;") );
x.m("ccc")

前两个对我来说很清楚,但我想知道第三个。 有人可以解释一下在定义后添加函数名称如何帮助 eval 完成这项工作吗? 您还知道使用 eval 创建函数的其他方法吗?

谢谢 西蒙

最佳答案

首先,使用 function 声明(不是表达式),创建函数并将其放入当前作用域:

function fname() { ... }

右大括号结束函数语句,后面是一个表达式:

fname

由于该函数已在作用域中,因此表达式 fname 仅引用该函数。由于表达式是经过评估的代码中的最后一个内容,因此 eval 返回的正是该函数引用。

您可以编写当前作用域中任何函数的名称,而不是fname,例如alert,然后由 eval 返回。

关于javascript - 使用 eval 从字符串创建函数的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11819109/

相关文章:

javascript - 此代码无法找到具有特定 id 的 div

string - 在 'eval' 中运行的 Python 字符串

r - 获取运行时运行的所有 R 代码

perl 用户提供的子程序,始终返回文本,而不是 eval

go - 在 go 应用程序中传递要评估的表达式?

javascript - Node.js 进程内 jsRender 的安全问题

javascript - 无法获取动态添加的文本

javascript - 如何使用 jQuery 使变量随机多次

javascript - 基础导航顶部栏不适用于 thymeleaf

javascript - 是否可以在 contentEditable 元素中禁用或控制 "commands"?