2012-01-20 3 views
3

После закодировано JavaScript с 1996 года, у меня есть очень простой вопрос, который я не мог четко доказать/опровергнуть с помощью jsfiddleРазъяснения в JavaScript переменного выпуска

В некоторых 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? 
} 

Моя скрипка является here

ответ

3

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

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

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

+0

Спасибо - я смутно помню, Netscape или Mozilla или Fx 1 или так дает мне ошибку, но так как это случилось только один раз для меня, возможно, я был неправ - я знаю, что он работает в для циклов, но это для меня очень локальная область. – mplungjan

+0

@mplungjan. Циклы 'var i' in for поднимаются в начало функции точно так же, как любая другая переменная, объявленная в области функции - все' i's в циклах ссылаются к той же переменной. Ситуация аналогична той, которую вы описываете. –

+0

Справа. Отметил. Спасибо – mplungjan

2

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

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

+0

Спасибо, я уверен, но у меня никогда не было этой проблемы, поэтому я думал, что попрошу – mplungjan

2

Я вполне уверен, что анализатор игнорирует второе «var» -declaration, поскольку он избыточен - все, что он делает, означает, что переменная ограничена локальной областью. Нет причин использовать его дважды в той же области действия, что и в той же функции, но если вы, как указано в @ 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" 
+0

Да, это то, что моя скрипка сделала в Fx10/Chrome16, но этого было недостаточно для меня, чтобы взять ее по номиналу. – mplungjan

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