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。为什么?
变量声明由解析器提升到词法范围的顶部。在第二个代码块中,它的实际运行方式是:
function f() {
var x, y;
y = x;
return y;
}
Run Code Online (Sandbox Code Playgroud)
函数声明也被提升。最终效果是变量声明应该被认为总是包括它出现的整个词法范围。如果在函数中的任何位置x声明了变量,则该函数中的每个引用都是对局部变量的引用。var x
在您的第一个示例中,该eval()行只是一个正则表达式语句,因此按其在函数中的出现顺序执行。