JavaScript внутренняя функциональная цепочка объема?

В этом примере

var a = 1;
( function(x) {   
   function inner() {
      alert(a);
      alert(x);
      alert(y); 
   }
   var y = 3;
   inner();
})(2);

Когда делает function inner быть созданными? в течение времени выполнения или времени парсинга внешней анонимной функции?

Из чего находится в цепочке объема function inner?

Из чего различие между цепочкой контекста выполнения и объема function inner?

Спасибо за enlighting меня заранее!

7
задан nandin 18 May 2010 в 15:16
поделиться

2 ответа

Когда создается внутренняя функция? во время выполнения или во время анализа внешней анонимной функции?

Один создается каждый раз, когда выполняется внешняя функция.

Что входит в цепочку областей видимости функции inner?

Когда вы ее выполняете, это выполнение получает объект переменной (технически спецификация называет это «связывающим объектом переменной среды»); это поддерживается объектом переменной, созданным для вызова внешней функции, которая создала inner ; это поддерживается объектом глобальной переменной. Итак:

+------------------------------+
| global variable obj          |
+------------------------------+
    ^
    |
   +-----------------------------+
   | variable obj for outer call |
   +-----------------------------+
       ^
       |
      +-----------------------------+
      | variable obj for inner call |
      +-----------------------------+

Что находится в контексте выполнения внутренней функции?

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

Вы можете прочитать обо всем этом (если хотите продираться через патологию набухшей прозы) в разделе 10 спецификации и, в частности, в разделе 10.4.3. : «Ввод кода функции» .

7
ответ дан 6 December 2019 в 12:46
поделиться

внутренний функция создается непосредственно перед выполнением анонимной функции процессом создания экземпляра переменной .

[[Область]] из внутренний при выполнении содержит:

  1. Пустой объект переменной из внутренний (он пуст, потому что внутри него нет объявлений переменных / функций)
  2. Объект переменной анонимной функции, который содержит x , y и внутренний .
  3. Глобальный объект, который будет содержать a и другие свойства ...
    Global (3)          Anonymous VO (2)       inner VO (1)
   ________              ________              ________
  | a = 1  | <--------- | x = 2  | < -------- |        |
  | ...    |            | y = 3  |             ¯¯¯¯¯¯¯¯ 
   ¯¯¯¯¯¯¯¯             | inner  |
                         ¯¯¯¯¯¯¯¯ 

Изменить : чтобы прояснить ваш второй вопрос:

В чем разница между контекстом выполнения и областью действия внутренняя цепочка функций?

Это две разные концепции, контекст выполнения создается непосредственно перед выполнением фрагмента кода (который может быть либо глобальным кодом, либо кодом функции, либо кодом 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 анонимная функция создается , текущая область видимости (содержащая только глобальный объект ) хранится в этот момент в свойстве функции [[Scope]] .

На шаге 2 выполняется эта анонимная функция, создается новый контекст выполнения (контекст выполнения кода функции ), в этот момент создается новая лексическая среда ( Создается объект переменной этой функции), все идентификаторы аргументов функции (в данном случае только x ), идентификаторы объявлений функций ( inner ) и идентификаторы объявлений переменных ( y ) привязываются как свойства, не подлежащие удалению, этого нового объекта переменной (который является новой лексической областью видимости).

На шаге 3 выполняется внутренняя функция, это создает новый контекст выполнения, в цепочку областей видимости вводится другой объект переменной, но в этом случае, поскольку ничего не объявляется внутри inner и у него нет никаких формальных параметров, это будет просто пустой объект.

См. Также этот ответ, в первой части я говорю об операторе с , но во второй части речь идет о функциях.

9
ответ дан 6 December 2019 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: