Странное поведение при обращении к глобальной переменной. Это ошибка в JavaScript? Конечно, это не так! - PullRequest
2 голосов
/ 25 февраля 2009

Рассмотрим следующий фрагмент кода.

<html>
<body>
<script>  
var x = 5; //globally declared
function showX() 
{ 
      alert("x="+x); //trying to display global value

      var x=10; //trying to create and initialize a local x
}
</script>
<input type = "button" value="Show X" onclick="showX()"> 
</body>
</html>

В уведомлении указано «x = undefined». И не печатает глобальное значение х, как ожидалось. Эквивалентный код Java будет отображать 5! Итак, это ошибка? Если нет, то как объяснить это поведение?

Ответы [ 3 ]

5 голосов
/ 25 февраля 2009

Спецификация ECMAScript говорит в разделе 12.2:

Если встречается оператор переменной внутри FunctionDeclaration, переменные определены с область действия функции в этой функции, как описано в разделе 10.1.3. Иначе, они определены с глобальной областью действия (то есть они созданы как члены глобального объекта, как описано в 10.1.3) использование атрибутов свойства {DontDelete}. Переменные созданы когда вводится область выполнения. Блок не определяет новое исполнение объем. Только программа и FunctionDeclaration производят новый объем. Переменные инициализируются в не определено при создании. Переменная с инициализатором назначается значение его AssignmentExpression, когда VariableStatement выполняется, а не когда переменная создана.

Так что это не ошибка - локальная переменная создается при входе в функцию.

2 голосов
/ 25 февраля 2009

Второе объявление var мешает первому. Вы на самом деле имеете в виду еще не объявленный локальный х. Однако, чтобы процитировать гуру javascript Дугласа Крокфорда:

Самая большая проблема JavaScript - это зависимость от глобальных переменных, особенно подразумеваемые глобальные переменные. Если переменная не является явно объявлен (обычно с заявление), то JavaScript предполагает что переменная была глобальной. Это может маскировать имена с ошибками и другие проблемы.

http://www.jslint.com/lint.html

Поэтому рекомендуется избегать использования глобальных переменных в максимально возможной степени.

1 голос
/ 25 февраля 2009

Область действия x - это функция block , в которой она объявлена ​​... хотя я считаю, что область действия в JavaScript иногда может быть немного хитрой. В C # это будет ошибка во время компиляции - она ​​будет пытаться использовать локальную переменную перед ее объявлением.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...