首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >eval(fn)和eval(arrowFn)返回不同的值。

eval(fn)和eval(arrowFn)返回不同的值。
EN

Stack Overflow用户
提问于 2017-05-05 12:59:33
回答 4查看 738关注 0票数 0

根据Mozilla博士,为了使用eval执行函数,必须将其包装在( )中,也就是说,如果不使用它们,则将其视为字符串。

eval作为字符串定义函数需要"(“和")”作为前缀和后缀。

当我执行普通函数时,它会像预期的那样返回undefined,但在ES6函数的情况下则不会返回。我的问题是,javascript引擎对ES6函数有不同的处理方式,或者只在eval函数中处理。

代码语言:javascript
运行
复制
var fn = "function a(){}";
var es6fn = "()=>{}";

console.log(eval(fn)); // undefined
console.log(eval(es6fn)); // ()=>{}
console.log(typeof eval(es6fn)); // ()=>{} i.e. a function

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-05-05 17:12:23

让我们后退一步,看看到底发生了什么。我想你误解了MDN想要表达的观点。在您的示例中执行的唯一函数是eval。文档中提到的(...)不是用于在字符串中执行函数,而是用于更改函数定义的计算方式。

函数调用将是function a(){}(),但文档讨论将函数定义放在括号内:(function(){})

基本上,定义功能的方法主要有:

  1. 函数声明 函数foo() {}
  2. 函数表达式 var foo = function() {}
  3. 函数 var foo = () => {}

要理解函数声明和函数表达式之间的区别,我们必须理解语句和表达式之间的区别(声明基本上就像语句)。

语句具有副作用,不会产生值。ifforswitch等都是语句。

表达式是产生值的东西。例如,5是一个产生值5的数字文字。5 + 3是一个计算两个文字之和的表达式,即计算它将返回值8。

函数声明就像语句。它本身不会产生一个值,但是作为副作用,定义了一个变量,其值是一个函数(您可以在规范中看到,在计算函数声明时不会发生任何事情。 (在那个时候已经处理了))。

函数表达式非常相似,但它不是定义变量,而是简单地计算它,从而得到函数对象。

这就是为什么

代码语言:javascript
运行
复制
eval('function a() {}') // undefined, but a is defined as side effect
eval('(function a() {})') // a function object

产生不同的结果。第一个被解释为函数声明。将创建一个变量a,但没有创建eval可以返回的值。在第二种情况下,分组操作符((...))强制将函数定义解释为函数表达式,这意味着一个值由eval生成并返回。

现在关于箭头函数:这里没有歧义。箭头函数定义总是表达式,即计算它们总是产生一个值。

代码语言:javascript
运行
复制
eval(`() => {}`) // a function object

的总结

虽然箭头函数和函数声明/表达式之间存在差异,但这种差异并不是您在eval中看到的结果的原因。这里的不同之处在于eval使用语句/声明和表达式。

票数 2
EN

Stack Overflow用户

发布于 2017-05-05 13:23:52

在您的示例中,a被声明为一个命名函数。在第二种情况下,只需编写一个表达式,即lambda函数。见这里这里

如果您想要为fn获得相同的效果,请执行

代码语言:javascript
运行
复制
`console.log(eval("var a = function(){}"))`; //`function(){}`.
票数 0
EN

Stack Overflow用户

发布于 2017-05-05 13:30:50

首先,EcmaScript是JavaScript的“官方”名称。现在ES2015已经完成,对大多数人来说,它实际上已经变成了JavaScript v6。因此,这种差异并不来自于不同的引擎。

不同行为的起源来自字符串的结果,字符串是写在eval函数中的。第一个eval字符串的结果是一个函数定义,没有任何可返回的内容。另一方面,第二个eval是计算一个lambda函数,所以这个值的结果就是那个函数。若要清除此概念,可以重写代码如下所示:

代码语言:javascript
运行
复制
var fn = "function a(){ return 1;}";
var es6fn = "()=>{}";

console.log(eval(fn)); // undefined
console.log(eval(es6fn)); // ()=>{}
console.log(typeof eval(es6fn)); // ()=>{} i.e. a function
console.log(a()); // call the a() function

如您所见,a()被定义为一个函数,您可以在第一个eval之后使用该函数。因此,运行第一个eval,并将所有这些返回到eval函数的返回值。

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

https://stackoverflow.com/questions/43805644

复制
相关文章

相似问题

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