我在做:
eval('function(){ console.log("Hello World"); }')();
但这会产生错误:
Uncaught SyntaxError: Unexpected token (
为什么这是错的?
答案 0 :(得分:3)
eval
运算符需要 Program 作为输入,而JavaScript的语法要求所有
顶级程序元素是声明或语句。
spec说:
让prog成为ECMAScript代码,它是将x解析为程序的结果。
function
无法启动顶级语句,但它可以启动函数声明,但仅限于它具有名称。
这就是为什么你得到“Unexpected token(”;它需要在括号之前打开参数列表的函数名。
正如其他人所指出的,对eval
函数来说,你需要欺骗JavaScript解析器找到一个需要语句的表达式。用括号包裹身体是一种方法。
答案 1 :(得分:0)
你想要的是这个:
eval( '(function(){ console.log("Hello World"); })()' );
让我们分解吧。你有一个自调用函数(一个自己调用的函数):
(function(){ console.log("Hello World"); })()
您将其作为字符串参数传递给eval
方法:
eval( '(function(){ console.log("Hello World"); })()' );
您的主要错误是尝试通过在eval
方法调用的末尾添加括号来调用 eval
返回的内容。如果你想要传递的函数立即调用自己,添加的括号应该是你传递给eval
的东西的一部分。
我假设您正在尝试做除了致电" Hello World"以外的其他事情,因为您可以这样做:
eval( 'console.log("Hello World");' );
或者,我敢说:
console.log("Hello World");
答案 2 :(得分:0)
eval
期待一个声明,但是:
function(){}
作为语句无效,因为缺少函数名称。
(function(){})
被识别,因为该语句是“语句表达式”。
问题是function
作为第一个标记在预期语句时触发函数声明规则。当需要表达式时(例如括号内),function
会触发函数表达式规则,其中名称是可选的但不是必需的。