2010-05-18 2 views
6

В этом примереВнутренняя функциональная цепочка 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?

Спасибо за то, что проинформировали меня заранее!

ответ

7

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

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

Что входит в сферу действия функции внутреннего?

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

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

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

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

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

+0

контекст выполнения создается во время выполнения, цепочка цепей создается во время определения (не уверен, что это правильный термин), мой вопрос: в чем разница между контекстом выполнения и цепочкой видимости функции внутри? Каков процесс создания контекста выполнения? спасибо! – nandin

+1

@Ding: Да, цепь видимости определяется тем, где определена функция. Вы можете сказать, посмотрев на функцию в источнике, какие идентификаторы в ней есть, и откуда они взяты. Но функции не имеют контекстов выполнения, а только * вызовы * для функций. Контекст выполнения включает объект переменной, который формирует механизм времени выполнения цепочки областей видимости, а также другие вещи, например, что такое значение this. Вы явно заинтересованы в том, чтобы знать, как это работает (что здорово!), И поэтому я могу только сказать: прочитайте раздел 10 (особенно 10.3 и 4) спецификации для деталей. :-) –

9

Функция inner создается, созданная непосредственно перед выполнением анонимной функции, процессом Variable Instantiation.

[[Scope]] из inner, когда он выполняется содержит:

  1. Пустой Переменный объект inner (пусто, потому что нет переменной/функции объявления внутри него)
  2. изменяемый объект анонимной функции, который содержит x, y и inner.
  3. Глобальный объект, который будет содержать 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, но во второй части речь идет о функциях.

+0

спасибо CMS, как всегда, отличный ответ! – nandin

+0

Добро пожаловать @Ding, отредактированный, чтобы ответить на ваш второй вопрос ... – CMS

+0

эту вещь действительно трудно прочитать (http://www.ecma-international.org/publications/standards/Ecma-262.htm), можете ли вы рекомендовать код JS с открытым исходным кодом? как насчет V8? спасибо! – nandin

Смежные вопросы