JavaScript引擎如何读取和执行具有冲突全局和局部变量的函数?
我需要了解浏览器中的JavaScript引擎如何读取函数。考虑下面的代码:JavaScript引擎如何读取和执行具有冲突全局和局部变量的函数?,javascript,Javascript,我需要了解浏览器中的JavaScript引擎如何读取函数。考虑下面的代码: var g = 5; alert(g); //alerts 5 function haha() { alert(g); // alerts NOTHING. Why is this? Why not alert 5? var g = 45 hasn't yet occurred var g = 45; alert(g); // alerts 45 }; haha(); alert(g); //
var g = 5;
alert(g); //alerts 5
function haha() {
alert(g); // alerts NOTHING. Why is this? Why not alert 5? var g = 45 hasn't yet occurred
var g = 45;
alert(g); // alerts 45
};
haha();
alert(g); // alerts 5. Because g = 45 is a local variable.
您在
haha
函数alertsundefined
中看到的alert(g)
的效果来自
haha
函数实际执行为:
function haha() {
var g;
alert(g);
g = 45;
alert(g);
}
这是因为变量和函数定义在JavaScript中被提升到其作用域的顶部
这种效果会导致一些相当不直观的行为,比如你所看到的。简单的解决方案是在执行任何代码之前始终声明变量和函数,以便编写的代码与正在执行的代码相匹配。有人可以提供有关此方面的ECMA文档吗?@Geoyws:,更具体地说,第8步。这太神奇了,@FelixKling。感谢大家所做的一切。看起来这是提升,与冲突的全局和局部变量无关。另一方面,需要有人修改ECMA的文档,使其更易于理解。