01.09.2008

JavaScript: область видимости переменных

В JavaScript область видимости переменных не ограничивается блоком {}, а ограничивается только функцией. Например, переменные объявленные внутри for или if продолжают жить после того, как эти for и if отработали.

for (var i = 0; i < 10; i += 1) {
    var a = i * i;
    // do something
}
document.writeln(i);    // 10
document.writeln(a);    // 81

if (true) {
    var b = "test";
    // do something
}
document.writeln(b);    // test


Поэтому, лучше явно обозначить это в коде.

var i, a;
for (i = 0; i < 10; i += 1) {
    a = i * i;
    // do something
}

var b;
if (true) {
    b = "test";
    // do something
}


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

var myFunction = function () {
    // Объявление всех локальных переменных, включая переменные циклов
    // Код функции
}

5 комментариев:

Shahen комментирует...

>В JavaScript область видимости переменных >не ограничивается блоком {}, а >ограничивается только функцией.

не только, уже порядка года есть let - который тоже ограничивает область видимости

>В JavaScript все используемые в функции >локальные переменные лучше объявлять в >самом начале функции.
чем лучше? почему бы, например, не в конце? )))

Степан Резников комментирует...

>> не только, уже порядка года есть let - который тоже ограничивает область видимости

Справедливое замечание, но let появился в JavaScript 1.7 и работает пока только в Firefox 2.0 и выше. Поэксперементировать можно (и нужно), но на практике ведь не применишь.

Степан Резников комментирует...

>> чем лучше? почему бы, например, не в конце? )))

Хотя бы из соображений читаемости кода.

alpha комментирует...

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

По-моему объявление переменных как можно ближе к месту первого использования все-таки не к конкретным языками программирования имеет отношение, а к самому подходу к программированию.

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

Анонимный комментирует...

>>> чем лучше? почему бы, например, не в конце?

объявление переменной в начале позволит избежать подобных ситуаций:

var x = "global";
(function f() {
alert(x); // prints "undefined"!
var x = "local";
alert(x); // prints "local"
})();