2013-04-12 2 views
0

Обновление: вопрос перезаписи, потому что исходный вопрос имел ложные предположения (я запускал код в консоли, которая уже инициализировала переменные, которые, как я думал, не были определены).JavaScript: Инициализация внутренней переменной после инициализации объекта

Это имеет смысл:

var obj = { 'whichScope': a }; 
obj.whichScope; //"ReferenceError: a is not defined" 

Но тогда как же этот следующий пример не выдаст ошибку? И если вторая строка запускается перед первой строкой, почему бы obj.whichScope не разрешить «После»?

var obj = { 'whichScope': a }; 
var a = "After"; 
obj.whichScope; //"undefined" 

Если «переменная A» в предыдущем примере выполняется перед OBJ инициализируется, делает любую часть «а =„После“;» также запускается до инициализации obj?

var a = "Before"; 
var obj = { 'whichScope': a }; 
a = "After"; 
obj.whichScope; //"Before" 

Если whichScope относится к функции, которая возвращает «а», то это решимость «После» в последнем примере.

ответ

1

Это называется переменной подъемной.

Список литературы:

переменные (объявленные с var) и функции поднимаются к верхней части их объема.

Технически, ваш сценарий выглядит так:

var a; // = undefined 
var obj = { 'whichScope': a }; 
a = "After"; 

Хотя ваш первый пример не делать то, что вы говорите. Значение obj.whichScope равно undefined, как и ожидалось.

DEMO:http://jsfiddle.net/pRQwK/

Что касается последнего заявления, If whichScope refers to a function that returns 'a' then it does resolve to "After" in the second example. - это потому, что значение a не захватывается (по закрытию). При настройке свойства его значение немедленно фиксируется (не связано с закрытием).

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