根据Mozilla博士,为了使用eval执行函数,必须将其包装在( )中,也就是说,如果不使用它们,则将其视为字符串。
eval作为字符串定义函数需要"(“和")”作为前缀和后缀。
当我执行普通函数时,它会像预期的那样返回undefined,但在ES6函数的情况下则不会返回。我的问题是,javascript引擎对ES6函数有不同的处理方式,或者只在eval函数中处理。
var fn = "function a(){}";
var es6fn = "()=>{}";
console.log(eval(fn)); // undefined
console.log(eval(es6fn)); // ()=>{}
console.log(typeof eval(es6fn)); // ()=>{} i.e. a function
发布于 2017-05-05 17:12:23
让我们后退一步,看看到底发生了什么。我想你误解了MDN想要表达的观点。在您的示例中执行的唯一函数是eval。文档中提到的(...)不是用于在字符串中执行函数,而是用于更改函数定义的计算方式。
函数调用将是function a(){}(),但文档讨论将函数定义放在括号内:(function(){})。
基本上,定义功能的方法主要有:
要理解函数声明和函数表达式之间的区别,我们必须理解语句和表达式之间的区别(声明基本上就像语句)。
语句具有副作用,不会产生值。if、for、switch等都是语句。
表达式是产生值的东西。例如,5是一个产生值5的数字文字。5 + 3是一个计算两个文字之和的表达式,即计算它将返回值8。
函数声明就像语句。它本身不会产生一个值,但是作为副作用,定义了一个变量,其值是一个函数(您可以在规范中看到,在计算函数声明时不会发生任何事情。 (在那个时候已经处理了))。
函数表达式非常相似,但它不是定义变量,而是简单地计算它,从而得到函数对象。
这就是为什么
eval('function a() {}') // undefined, but a is defined as side effect
eval('(function a() {})') // a function object产生不同的结果。第一个被解释为函数声明。将创建一个变量a,但没有创建eval可以返回的值。在第二种情况下,分组操作符((...))强制将函数定义解释为函数表达式,这意味着一个值由eval生成并返回。
现在关于箭头函数:这里没有歧义。箭头函数定义总是表达式,即计算它们总是产生一个值。
eval(`() => {}`) // a function object对的总结
虽然箭头函数和函数声明/表达式之间存在差异,但这种差异并不是您在eval中看到的结果的原因。这里的不同之处在于eval使用语句/声明和表达式。
发布于 2017-05-05 13:23:52
发布于 2017-05-05 13:30:50
首先,EcmaScript是JavaScript的“官方”名称。现在ES2015已经完成,对大多数人来说,它实际上已经变成了JavaScript v6。因此,这种差异并不来自于不同的引擎。
不同行为的起源来自字符串的结果,字符串是写在eval函数中的。第一个eval字符串的结果是一个函数定义,没有任何可返回的内容。另一方面,第二个eval是计算一个lambda函数,所以这个值的结果就是那个函数。若要清除此概念,可以重写代码如下所示:
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函数的返回值。
https://stackoverflow.com/questions/43805644
复制相似问题