Функция inner
создается, созданная непосредственно перед выполнением анонимной функции, процессом Variable Instantiation.
[[Scope]]
из inner
, когда он выполняется содержит:
- Пустой Переменный объект
inner
(пусто, потому что нет переменной/функции объявления внутри него)
- изменяемый объект анонимной функции, который содержит
x
, y
и inner
.
- Глобальный объект, который будет содержать
a
и другие свойства ...
Global (3) Anonymous VO (2) inner VO (1)
________ ________ ________
| a = 1 | <--------- | x = 2 | < -------- | |
| ... | | y = 3 | ¯¯¯¯¯¯¯¯
¯¯¯¯¯¯¯¯ | inner |
¯¯¯¯¯¯¯¯
Редактировать: Для того, чтобы прояснить ваш второй вопрос:
В чем разница между контекстом исполнения и цепочки областей видимости функции внутренней?
Существует два различных понятия, контекст исполнения создается непосредственно перед куском кода (который can be либо глобальный код, код функции или код Eval) выполняется.
Я думаю, что это могло бы быть проще объяснить с кодом:
var a = 1;
(function(x) { // Step 1
function inner() {
alert(a);
alert(x);
alert(y);
}
var y = 3;
inner(); // Step 3
})(2); // Step 2
В Шаг 1, анонимная функция created, текущая область (содержащие только один глобальный объект) хранится в этом момент на функции [[Scope]]
собственности.
В Шаг 2, эта анонимная функция выполняется, новый контекст выполнения создается (а function code execution context), в данный момент создается новая лексическая среда (изменяемый объект этой функции создается), все функции Идентификаторы аргументов (в этом случае только x
), идентификаторы объявлений функций (inner
) и идентификаторы объявлений переменных (y
) привязаны как не подлежащие удалению свойства этого нового объекта переменной (который является новой лексической областью).
В Шаг 3 функция inner
выполняется, это создает новый контекст исполнения, другой изменяемый объект вводится в область цепи, но в данном случае, так как ничего не объявлена внутри inner
, и это не имеет какого-либо формальные параметры, это будет просто пустой объект.
См. Также this Ответ, первая часть Я говорю о заявлении with
, но во второй части речь идет о функциях.
контекст выполнения создается во время выполнения, цепочка цепей создается во время определения (не уверен, что это правильный термин), мой вопрос: в чем разница между контекстом выполнения и цепочкой видимости функции внутри? Каков процесс создания контекста выполнения? спасибо! – nandin
@Ding: Да, цепь видимости определяется тем, где определена функция. Вы можете сказать, посмотрев на функцию в источнике, какие идентификаторы в ней есть, и откуда они взяты. Но функции не имеют контекстов выполнения, а только * вызовы * для функций. Контекст выполнения включает объект переменной, который формирует механизм времени выполнения цепочки областей видимости, а также другие вещи, например, что такое значение this. Вы явно заинтересованы в том, чтобы знать, как это работает (что здорово!), И поэтому я могу только сказать: прочитайте раздел 10 (особенно 10.3 и 4) спецификации для деталей. :-) –