浏览器在执行之前是否加载了整个JavaScript块?

时间:2009-10-03 00:05:47

标签: javascript function scripting

以下是有效的javascript代码:

<script>
  foo();

  function foo()
  {
    alert("foo");
  }
</script>

函数foo在声明之前被调用。所以,我认为浏览器必须在执行之前加载整个块脚本。通过“整个块”,我的意思是对open标签或外部javascript文件的开放标记。这是真的吗?

3 个答案:

答案 0 :(得分:2)

Function statements吊装的约束。这意味着无论声明函数的位置如何,它都会移动到定义函数的作用域的顶部。

(function () {
  foo();

  function foo() {
    alert('foo is beign called');
  }
}());

在编译时,该代码的结构将更改为:

(function () {
  function foo() {
    alert('foo is beign called');
  }

  foo();
}());

函数语句不是唯一需要提升的函数,因为var语句也是如此(并且因为JavaScript只有函数作用域),建议顶部只有one var statement一个函数,例如:

var bar = "baz"; // on the outer scope
(function () {
  alert(bar); // bar is undefined

  var bar = "other value";
}());

警报显示undefined,因为内部代码更改为:

var bar = "baz";
(function () {
  var bar;
  alert(bar); // bar is undefined

  bar = "other value";
}());

答案 1 :(得分:1)

如果方法或变量未定义,则抛出错误“undefined”,但如果声明但未赋值,那么js不会抛出任何错误。

<script>
  foo();

  function foo()
  {
    alert("foo");
  }
</script>

但是你的代码不会抛出任何异常,你也可以轻松调试你的javascript代码。这是一个很好的视频,展示了如何调试js代码:Debugging with Firebug

答案 2 :(得分:0)

当我将JS粘贴到Firebug中时,我得到“foo未定义”。

JS的大多数实现将加载整个文件,然后执行它。文件中的语句按顺序执行,因此函数foo的调用发生在定义之前,这是ECMA 262标准第8.7节所要求的错误。 1