【问题标题】:Does Browser load a whole block of JavaScript Before its execution?浏览器在执行之前会加载整个 JavaScript 块吗?
【发布时间】:2009-10-03 00:05:46
【问题描述】:

以下是有效的 javascript 代码:

<script>
  foo();

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

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

【问题讨论】:

标签: javascript function scripting


【解决方案1】:

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";
}());

【讨论】:

    【解决方案2】:

    如果一个方法或变量是未定义的,它会抛出一个错误“未定义”,但如果它被声明但没有赋值,那么js不会抛出任何错误。

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

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

    【讨论】:

    • 不,不,不。你可以试试看。在同一块中,您可以在声明之前使用函数。
    • @Morgan:对不起,我弄错了函数 var hello = function(){} 和函数 hello()。谢谢。
    【解决方案3】:

    当我将该 JS 粘贴到 Firebug 中时,我得到“foo is not defined”。

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

    【讨论】:

    • @Berry,如何将其粘贴到 Firebug 中?您可以将其粘贴到 html 中并使用 Firefox 打开它。我敢打赌它会起作用。
    • Firebug 有一个调试控制台,您可以在其中在自己的上下文中执行自定义代码。
    猜你喜欢
    • 2011-01-06
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 2016-06-24
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多