首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eval函数表达式

Eval函数表达式
EN

Stack Overflow用户
提问于 2019-05-08 11:54:25
回答 4查看 99关注 0票数 0

当我期待这段代码

代码语言:javascript
复制
var  a = eval("function() { return 1; }");

console.log(a());

在控制台中打印'1‘,我得到一个语法错误Uncaught SyntaxError: Unexpected token (。我在这里做错什么了?

我正在使用一个允许在配置中定义javascript函数的框架,所以我别无选择,只能使用eval。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-05-08 12:10:31

不能以这种方式混合函数声明和函数表达式。您必须在eval()中执行完整的声明或表达式。

代码语言:javascript
复制
 eval("function a() { return 1; }");
 console.log(a());

这是可行的,因为我们给函数声明一个正确的名称,a,然后调用它在全局范围上创建的函数。

代码语言:javascript
复制
 eval("var a = function() { return 1; }");
 console.log( a() );

这也是可行的,因为将它赋值给变量a的函数表达式现在是计算结果的一部分。然后我们可以调用它的作用域中的函数。

如果有其他选择的话,这两种方法都不应该被实际使用。最常见的选择是使用new Function();

代码语言:javascript
复制
var a = new Function( 'return 1;' );
console.log( a() );

这实现了相同的最终结果,并且比使用eval()稍微安全一些。

不过,如果这是框架允许定义额外javascript函数的唯一方式,我会感到惊讶。我想,由于它是在配置某个东西,所以安全性问题不像公共代码那么重要。但是,我会重新阅读框架的文档,以反复检查这是唯一的选择。

票数 1
EN

Stack Overflow用户

发布于 2019-05-08 12:04:39

function关键字在Javascript中是不明确的:它可以启动函数声明(语句)或函数文字(表达式)。当在语句位置遇到function时,解析器自动倾向于声明而不是表达式。由于eval需要一条语句,这使得您的代码无效--声明需要函数名。您可以提供一个名称:

代码语言:javascript
复制
eval('function foo() {...}')

或者强制解析器进入表达式模式。

代码语言:javascript
复制
foo = eval('( function () {...} )')

在这种情况下,function将被视为文字。

这与{}的故事基本相同,它可以是块,也可以是对象文本。像eval('{1:2}')这样的东西会因为同样的原因而失败(语句优先于表达式)。

票数 4
EN

Stack Overflow用户

发布于 2019-05-08 12:02:13

问题是,您有一个功能声明,这需要一个名称。作为参考,这是一个函数声明。

代码语言:javascript
复制
function myFunc() { console.log("executed") } //<-- declaration

myFunc(); //<-- execution

您希望拥有的是一个未命名的函数表达式。

代码语言:javascript
复制
var myFunc = function() { console.log("executed") }
//expression ^------------------------------------^

myFunc(); //<-- execution

或者对于没有分配给变量的真正未命名的函数,您可以有一个生命周期。

代码语言:javascript
复制
// v--------- brackets surrounding expression ---------v
   (            function() { console.log("executed") } )()
//expression    ^------------------------------------^  ^^
//execution  -------------------------------------------++

但是,在JavaScript中,以function关键字开头的独立语句将被视为声明,如果它没有名称,则无效。

但是,您可以将表达式括在括号中,以使其为解析器所接受。

代码语言:javascript
复制
//brackets    v--------------------------v
var a = eval("( function() { return 1; } )");
//              ^----------------------^ function expression
console.log(a());

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56040225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档