Загружает ли браузер целый блок JavaScript перед его выполнением? - PullRequest
0 голосов
/ 03 октября 2009

Ниже действующий код JavaScript:

<script>
  foo();

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

Функция foo вызывается до ее объявления. Итак, я думаю, что браузер должен загрузить весь блок-скрипт перед его выполнением. Под «целым блоком» я подразумеваю открытый тег для тега clos или внешнего файла JavaScript. Это правда?

Ответы [ 3 ]

2 голосов
/ 03 октября 2009

Операторы функций подлежат подъему . Это означает, что независимо от того, где функция объявлена, она перемещается в верхнюю часть области, в которой она определена.

(function () {
  foo();

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

Во время компиляции структура этого кода изменится на:

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

  foo();
}());

Операторы функций - не единственные, которые являются предметом подъема, оператор var также, из-за этого (и поскольку JavaScript имеет только область действия) рекомендуется иметь только оператор var в верхней части функции, например:

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 голос
/ 03 октября 2009

Если метод или переменная не определены, они выдают ошибку «неопределено», но если они объявлены, но не присвоены значения, то js не выдаст ошибку.

<script>
  foo();

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

Но ваш код не будет выдавать никаких исключений, а также вы можете легко отлаживать свой код JavaScript. Вот хорошее видео, показывающее, как отлаживать js-коды: Отладка с помощью Firebug

0 голосов
/ 03 октября 2009

Когда я вставляю этот JS в Firebug, я получаю "foo is notfined".

Большинство реализаций JS загружают весь файл, а затем исполняют его. Операторы в файле выполняются по порядку, поэтому вызов для функции foo происходит до ее определения , что является ошибкой, как того требует стандарт ECMA 262, раздел 8.7.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...