究竟是如何解释JavaScript的?

Kir*_*lev 7 javascript

我一直以为浏览器会逐字逐句地从上到下执行JavaScript代码(你有点期望这种行为来自脚本语言).但显然情况并非如此:

//工作完美

<script>
  test();
  function test() { alert('test'); }
</script>
Run Code Online (Sandbox Code Playgroud)

但如果我将函数声明为变量,它将失败并显示'未捕获的ReferenceError:未定义测试':

<script>
  test();
  var test = function() { alert('test'); }
</script>
Run Code Online (Sandbox Code Playgroud)

所以javascript引擎有时不会从上到下执行代码.它可以以某种方式预加载函数,即使它们最终被声明.它究竟是如何工作的?为什么?

Sir*_*rko 9

这是函数和变量提升的示例:函数和变量声明被移动到当前范围的顶部.

您的示例在内部转换为:

情况1:

<script>
  function test() { alert('test'); }
  test();
</script>
Run Code Online (Sandbox Code Playgroud)

案例2:

<script>
  var test;
  test();
  test = function() { alert('test'); }
</script>
Run Code Online (Sandbox Code Playgroud)

由此可以推断,在第二种情况下test,当您尝试执行变量时,变量是未定义的.