Разъяснение вопроса о переменной JavaScript - PullRequest
3 голосов
/ 20 января 2012

Кодируя JavaScript с 1996 года, у меня есть очень простая проблема, которую я не мог четко доказать / опровергнуть с помощью jsfiddle

В некоторых JS, прикрепленных к резюме, я обнаружил некоторые проблемы, которые я хотел бы проверить - однаиз которых множественное объявление переменной в одной и той же функции

Тестирование кажется разрешенным в более новых браузерах (OSX Chrome16 Fx 10beta) - насколько я помню, оно использовалось для выдачи ошибок (Netscape / Mozilla / Fx1 /IE5 или около того):

function something() {
  var var1 = "";
.
/* reams of code which scrolls the first declaration off the screen 
   so the author likely forgot the var was already declared earlier 
   in the same function */
.
  var var1 = ""; // could this result in an error in some browsers?
}

Моя скрипка здесь

Ответы [ 3 ]

3 голосов
/ 20 января 2012

Насколько я знаю, я видел функции javascript с несколькими циклами for, каждый из которых объявлял свои собственные var i в течение по крайней мере 6 лет без проблем.

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

В таком виде, я хотел бы предположить, что он не показывает особенно хорошего знания области видимости (и подъема) в javascript, но, тем не менее, является допустимым кодом.

2 голосов
/ 20 января 2012

Я совершенно уверен, что синтаксический анализатор игнорирует второе объявление "var", поскольку оно избыточно - все, что он делает, это означает, что переменная ограничена локальной областью действия. Нет смысла использовать его дважды в одной и той же области видимости, как в одной и той же функции, но если у вас, как указал @ rich.okelly, есть циклы или функции, вы действительно можете использовать «var» для создания локальной переменной того же имя в качестве переменной в более высоком объеме. Это не красиво, и, конечно, не делает никаких чудес для удобочитаемости, но это возможно. Я никогда не сталкивался с браузером, который зависает при добавлении переменной к переменной «var» дважды.

Пример:

x = "Hello";

function test() { 
    alert(x); // Outputs "Hello"
}
function test2() { 
    var x = "local variable";
    alert(x); // ouputs "local variable"
    var x = "changed the variable"; // this does exactly the same thing as if you'd omitted "var"
}
alert(x); // Outputs "Hello"
2 голосов
/ 20 января 2012

Я играл с javascript около того времени, как вы, и я не помню, чтобы это когда-либо было запрещено переводчиком.Глядя на спецификацию ECMAScript 1 , я не вижу упоминания о том, что объявления переменных уникальны в данной области видимости;и было бы странно удалить эту особенность.

Отсутствие такой проверки, наряду с тем фактом, что переменные являются функцией ~, а не областью видимости блока, является одной из вещей, которая может вызвать недопонимание, когдапеременная, "объявленная" в одном блоке, неожиданно имеет последнее значение, которое она имела в предыдущем блоке.

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