假设我们有如下代码。函数
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
没有被覆盖?请对此进行一些说明。非常感谢。
这取决于周围上下文的严格模式。
严格模式下,函数不会泄露出
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