eval 中的函数声明不会覆盖之前的函数声明

问题描述 投票:0回答:1

假设我们有如下代码。函数

a
被声明两次。我们知道控制台中的输出应该是

这是a2

因为函数的第二个声明

a
覆盖了前一个函数
a

function a ()
{
   console.log("this is a1");
}
function a ()
{
   console.log("this is a2");
}
a();

但是使用时情况就不一样了

eval

假设我们将代码更改如下。

eval("function a (){console.log (\"this is a1\")}");

function a ()
{
   console.log("this is a2");
}
a();

输出显示

这是a1

我的问题是为什么在这种情况下函数

a
没有被覆盖?请对此进行一些说明。非常感谢。

javascript function eval
1个回答
0
投票

这取决于周围上下文的严格模式

严格模式下,函数不会泄露出

eval
:

$ cat aa.js
"use strict";
eval("function a (){console.log (\"this is a1\")}");

function a (){console.log("this is a2");}
a();
$ node aa.js
this is a2
$

对于非严格模式,这是关于提升的;你的正常

function a() {}
被(无形地)提升到你的块的顶部,所以它在功能上发生在
eval
之前。如果您将其更改为作业,则不会发生这种情况。

$ cat aa.js
eval("function a (){console.log (\"this is a1\")}");
var a = function a (){console.log("this is a2");}
a();
$ node aa.js
this is a2
© www.soinside.com 2019 - 2024. All rights reserved.