当我期待这段代码
var a = eval("function() { return 1; }");
console.log(a());在控制台中打印'1‘,我得到一个语法错误Uncaught SyntaxError: Unexpected token (。我在这里做错什么了?
我正在使用一个允许在配置中定义javascript函数的框架,所以我别无选择,只能使用eval。
发布于 2019-05-08 12:10:31
不能以这种方式混合函数声明和函数表达式。您必须在eval()中执行完整的声明或表达式。
eval("function a() { return 1; }");
console.log(a());
这是可行的,因为我们给函数声明一个正确的名称,a,然后调用它在全局范围上创建的函数。
eval("var a = function() { return 1; }");
console.log( a() );
这也是可行的,因为将它赋值给变量a的函数表达式现在是计算结果的一部分。然后我们可以调用它的作用域中的函数。
如果有其他选择的话,这两种方法都不应该被实际使用。最常见的选择是使用new Function();。
var a = new Function( 'return 1;' );
console.log( a() );
这实现了相同的最终结果,并且比使用eval()稍微安全一些。
不过,如果这是框架允许定义额外javascript函数的唯一方式,我会感到惊讶。我想,由于它是在配置某个东西,所以安全性问题不像公共代码那么重要。但是,我会重新阅读框架的文档,以反复检查这是唯一的选择。
发布于 2019-05-08 12:04:39
function关键字在Javascript中是不明确的:它可以启动函数声明(语句)或函数文字(表达式)。当在语句位置遇到function时,解析器自动倾向于声明而不是表达式。由于eval需要一条语句,这使得您的代码无效--声明需要函数名。您可以提供一个名称:
eval('function foo() {...}')或者强制解析器进入表达式模式。
foo = eval('( function () {...} )')在这种情况下,function将被视为文字。
这与{}的故事基本相同,它可以是块,也可以是对象文本。像eval('{1:2}')这样的东西会因为同样的原因而失败(语句优先于表达式)。
发布于 2019-05-08 12:02:13
问题是,您有一个功能声明,这需要一个名称。作为参考,这是一个函数声明。
function myFunc() { console.log("executed") } //<-- declaration
myFunc(); //<-- execution
您希望拥有的是一个未命名的函数表达式。
var myFunc = function() { console.log("executed") }
//expression ^------------------------------------^
myFunc(); //<-- execution
或者对于没有分配给变量的真正未命名的函数,您可以有一个生命周期。
// v--------- brackets surrounding expression ---------v
( function() { console.log("executed") } )()
//expression ^------------------------------------^ ^^
//execution -------------------------------------------++
但是,在JavaScript中,以function关键字开头的独立语句将被视为声明,如果它没有名称,则无效。
但是,您可以将表达式括在括号中,以使其为解析器所接受。
//brackets v--------------------------v
var a = eval("( function() { return 1; } )");
// ^----------------------^ function expression
console.log(a());
https://stackoverflow.com/questions/56040225
复制相似问题