在函数字符串上使用eval

时间:2014-08-21 12:39:10

标签: javascript

我在做:

eval('function(){ console.log("Hello World"); }')();

但这会产生错误:

Uncaught SyntaxError: Unexpected token (

为什么这是错的?

3 个答案:

答案 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会触发函数表达式规则,其中名称是可选的但不是必需的。