JavaScript引擎如何使用冲突的全局变量和局部变量读取和执行函数?

geo*_*yws 3 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); // alerts 5. Because g = 45 is a local variable.
Run Code Online (Sandbox Code Playgroud)

小提琴

zzz*_*Bov 5

alert(g)haha功能警报中看到的效果undefined来自变量提升.

haha函数实际执行如下:

function haha() {
    var g;
    alert(g);
    g = 45;
    alert(g);
}
Run Code Online (Sandbox Code Playgroud)

这是因为变量和函数定义在JavaScript中被提升到其范围的顶部.

这种效果可能导致一些相当不直观的行为,例如你所看到的.简单的解决方案是在任何执行代码之前始终声明变量和函数,以便编写的代码与正在执行的代码匹配.

  • @Geoyws:http://es5.github.io/#x10.4.3,更具体地说,http://es5.github.io/#x10.5,第8步. (2认同)