В JavaScript, какой код выполняется во время выполнения и какой код выполняется во время анализа? - PullRequest
20 голосов
/ 26 октября 2010

Особенно в отношении объектов, я не понимаю, какие части объекта выполняются до инициализации, что выполняется при инициализации, а что выполняется через некоторое время.

РЕДАКТИРОВАТЬ: Кажется, что parsetime это неправильное слово. Полагаю, мне следовало сформулировать вопрос «В двухпроходном чтении, что читается при первом проходе, а что читается при втором?»

Ответы [ 5 ]

31 голосов
/ 26 октября 2010

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

foo();

function foo() {
  return 5;
}

но следующее не

foo(); // ReferenceError: foo is not defined

foo = function() {
  return 5;
}

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

4 голосов
/ 26 октября 2010

Не уверен, что именно вы спрашиваете, поэтому я просто поделюсь тем, что знаю.

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

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

Все команды вне функции будут анализироваться в порядке их появления.

У JavaScript на самом деле нет «времени выполнения», он может только отвечать на события или иметькод выполняется через глобальные таймеры.Любой другой код будет проанализирован и "забыт".

3 голосов
/ 26 октября 2010

Хотя прямым предком JavaScript является Scheme, JavaScript не наследовал макросы, поэтому ответ довольно прост: никогда не выполняется ни один код во время анализа.

2 голосов
/ 26 октября 2010

В отличие от C ++, невозможно выполнить логику в анализаторе Javascript.

Я подозреваю, что вы спрашиваете, какой код запускается немедленно и какой код запускается при создании каждого экземпляра объекта.

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

1 голос
/ 08 июня 2015

Грубо говоря, Интерпретатор сначала получает все переменные и функции, а затем они поднимаются и выполняются.

Для более подробной информации, я надеюсь, что эти ссылки могут быть полезны:

...