Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript引擎如何读取和执行具有冲突全局和局部变量的函数?_Javascript - Fatal编程技术网

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); //

我需要了解浏览器中的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.

您在
haha
函数alerts
undefined
中看到的
alert(g)
的效果来自

haha
函数实际执行为:

function haha() {
    var g;
    alert(g);
    g = 45;
    alert(g);
}
这是因为变量和函数定义在JavaScript中被提升到其作用域的顶部


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

有人可以提供有关此方面的ECMA文档吗?@Geoyws:,更具体地说,第8步。这太神奇了,@FelixKling。感谢大家所做的一切。看起来这是提升,与冲突的全局和局部变量无关。另一方面,需要有人修改ECMA的文档,使其更易于理解。