7

我一直认为浏览器从上到下逐个字符串地执行 JavaScript 代码(你有点期待脚本语言的这种行为)。但显然这里不是这样:

//完美运行

<script>
  test();
  function test() { alert('test'); }
</script>

但是如果我将函数声明为变量,它会因“未捕获的 ReferenceError:未定义测试”而失败:

<script>
  test();
  var test = function() { alert('test'); }
</script>

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

4

1 回答 1

9

这是一个函数和变量提升的例子:函数和变量声明被移动到当前作用域的顶部。

您的示例在内部转换为:

情况1:

<script>
  function test() { alert('test'); }
  test();
</script>

案例二:

<script>
  var test;
  test();
  test = function() { alert('test'); }
</script>

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

于 2013-05-24T22:58:25.463 回答