2013-05-05 1 views
2

Я понимаю, как это работает (несоответствия между локальными и глобальными функциями), но я не совсем понимаю, как скрывать глобальные переменные в функциях, тогда как «локальная» переменная еще не определена или не инициализирована.Javascript - Почему глобальные переменные скрыты во всей функции (тела)?

var scope = "global"; 
function checkscope() { 
    console.log(scope); 
} 
//this returns >> undefined 

Я читаю "JavaScript: The Definitive Guide (шестое издание)" и я говорю о главе 3.10 здесь. (стр. 54, если быть точным).

2 страницы позже, на странице 56 книги говорит:

«В не вложенной функции, сфера цепь состоит из двух объектов. -Первых, это объект, который определяет параметры функции и локальные переменные, а второй является глобальным объектом.»

не то, что будет означать, что глобальные переменные,„свойства“глобального объекта находятся в целая цепочка не-вложенной функции? Разве это не противоречит сказанному ранее 2 страницам?

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

+3

я не понимаю. В вашем примере кода 'scope' не будет' undefined'. Способность внутренней области переменной иметь возможность ссылаться на переменные ее внешней области (областей) - это то, как работает лексическое обследование. – 2013-05-05 02:44:45

+0

Ваш пример печатает «глобальный». – zneak

+0

Стр. 54 of Javascript: The Definitive Guide имеет тот же самый код (с добавленными двумя строками, которые объявляют локальное значение, а затем снова регистрируют его). Он также буквально говорит: «Вы можете подумать, что первая строка функции будет печатать« global », потому что оператор var , объявляющий локальную переменную, еще не выполнен». и за строкой «console.log (scope); у него есть комментарий // Печать« undefined », а не« global » –

ответ

8

В соответствии с комментариями, код в вопросе:

var scope = "global"; 
function checkscope() { 
    console.log(scope); 
    var scope; 
    console.log(scope); 
} 

Это будет регистрировать undefined в два раза, так как var деклараций (а также объявления функций) являются hoisted up к верхней части текущей области. Выше скрипт интерпретируется как:

var scope = "global"; 
function checkscope() { 
    var scope; //declaration hoisted up to top of scope 
    console.log(scope); 
    console.log(scope); 
} 

В checkscope имеет локальную переменную scope, scope переменных локальную scope переменной shadows внешней области в.

Местная переменная scope не имеет для нее значения, что эквивалентно значению undefined для JavaScript.


Побочное примечание: если внешняя сфера в вопросе является глобальным, в среде браузера, вы можете получить доступ к глобальной scope переменной с помощью ссылки на глобальный объект (window):

var scope = "global"; 
function checkscope() { 
    var scope; //declaration hoisted up to top of scope 
    console.log(scope); //undefined 
    console.log(window.scope); //"global" 
} 

Как вы можете видеть, переменные, объявленные в глобальной области видимости, становятся свойствами объекта window.

Этот трюк не очень полезен, если внешняя область не является глобальной, переменная scope останется скрытой, если вы ее не переименуете. Насколько я знаю, стандартного способа доступа к теневым свойствам (переменным/функциям) контекстов исполнения родительских объектов нет.

+0

Спасибо за это объяснение, это было очень полезно. –

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