javascript - 如何对包含函数的字符串执行“eval”
问题描述
在下面的示例中,我希望b
和c = eval(a)
包含相同的函数,一个始终返回 true 的函数。但是,a
不会被评估,而是会引发语法错误:
Uncaught SyntaxError: Function statements require a function name
. 但是,如果为函数命名,则c
包含undefined
.
var a = "function() { return true }";
var b = function() { return true };
var c = eval(a);
console.log(b,c);
解决方案
问题是您输入的代码正在eval
预期的语句处被评估,但您之后的代码var b =
被评估为表达式。当解析器期待一个语句时,function
关键字开始一个函数声明,它需要一个名称。但是在需要表达式的地方,function
关键字会启动一个函数表达式,其中名称是可选的。
要eval
改为使用表达式,请将代码用(
and括起来)
:
var a = "function() { return true }";
var b = function() { return true };
var c = eval("(" + a + ")");
// −−−−−−−−−−^^^^^−−−^^^^^
console.log(b,c);
警告:使用时要非常小心,eval
并尽可能避免使用它。它的目的是从字符串执行任意代码。如果您使用它,您必须相信该字符串的来源是值得信赖的。永远不要从用户 A 获取用户输入,然后eval
在用户 B 的会话中输入,除非用户 B 完全知道发生了什么(例如,与上面的堆栈片段一样——我是用户 A,你是用户 B;大概如果单击“运行”按钮,您将意识到代码将运行)。事实上,在与非程序员打交道时,甚至不要在用户 A 的会话中评估来自用户 A 的代码。:-)
推荐阅读
- css - 使用 VUE CLI 3 配置 SASS 加载器(替换 Koala-app)
- java - 数组的索引超出范围(java)
- html - 如何解决没有在 Django 模板上加载的 CSS 背景图像
- android - Flutter:ListView 里面的 ListView.builder
- autodesk-forge - Forge Viewer:搜索或模型浏览器
- reactjs - 如何在反应中向 Firebase REST API 发送 POST 请求
- python - Python & Google Sheets - 在第 5 行和第 3 列中查找元素
- c - 将 c 程序中的内存与 AVX 的外部程序集对齐
- python - 当我从文件中提取数据时尝试在 python 脚本中使用 read(\n) 时出现 TypeError
- mysql - MySQL Select with join & max 给出了意外的输出