javascript中eval内部的声明

Ism*_*awi 3 javascript scope eval

考虑以下两个 JavaScript 片段:

var x = 2;
function f() {
    var y = x;
    eval('var x;');
    return y;
}
Run Code Online (Sandbox Code Playgroud)

对比

var x = 2;
function f() {
    var y = x;
    var x;
    return y;
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是我已经替换eval('var x;');var x;.

第一个返回2,但第二个返回undefined。为什么?

Poi*_*nty 5

变量声明由解析器提升到词法范围的顶部。在第二个代码块中,它的实际运行方式是:

function f() {
  var x, y;
  y = x;
  return y;
}
Run Code Online (Sandbox Code Playgroud)

函数声明也被提升。最终效果是变量声明应该被认为总是包括它出现的整个词法范围。如果在函数中的任何位置x声明了变量,则该函数中的每个引用都是对局部变量的引用。var x

在您的第一个示例中,该eval()行只是一个正则表达式语句,因此按其在函数中的出现顺序执行。