我一直认为浏览器会逐个字符串地从上到下执行JavaScript代码(您希望这种行为来自脚本语言)。但显然情况并非如此:
//完美无缺
<script>
test();
function test() { alert('test'); }
</script>
但是如果我将函数声明为变量,它将失败并显示'未捕获的ReferenceError:未定义测试':
<script>
test();
var test = function() { alert('test'); }
</script>
因此javascript引擎有时不会从上到下执行代码。它可以以某种方式预加载函数,即使它们最终被声明。 它究竟是如何工作的?为什么?
答案 0 :(得分:9)
这是函数和变量提升的示例:函数和变量声明被移动到当前范围的顶部。
您的示例在内部转换为:
案例1:
<script>
function test() { alert('test'); }
test();
</script>
案例2:
<script>
var test;
test();
test = function() { alert('test'); }
</script>
由此可以推断,在第二种情况下,当您尝试执行变量test
时,它是未定义的。