Один var для функции в JavaScript?
Я использую JSLint, чтобы заставить меня чувствовать себя плохо в моем JavaScript. Это здорово, кстати. Есть одна проверка, которую я не совсем понимаю, и мне бы хотелось, чтобы вы взглянули на нее.
От jslint.com:
В языках с областью блока обычно рекомендуется объявлять переменные на сайте первого использования. Но поскольку JavaScript не имеет области блока, разумнее объявить все функциональные переменные в верхней части функции. Рекомендуется использовать один оператор var для каждой функции.
Какое последнее высказывание смелым действительно говорит? Я думаю, что я должен объявить несколько переменных вроде этого?
var foo = 1, bar = 2;
И, является ли "мудрая" часть просто программным стилем, чтобы препятствовать ошибкам в строке или есть больше для нее, чем это?
Спасибо за вашу помощь.
Ответы
Ответ 1
Проблема в том, что, осознаете вы это или нет, javascript невидимо перемещает все объявления var в начало области действия.
так что если у вас есть такая функция
var i = 5;
function testvar () {
alert(i);
var i=3;
}
testvar();
окно предупреждения будет содержать undefined. потому что внутренне он был изменен на это:
var i = 5;
function testvar () {
var i;
alert(i);
i=3;
}
testvar();
это называется "подъем".
Причина, по которой crockford так сильно защищает объявления var, идет вверху, заключается в том, что он делает код явно совместимым с тем, что он собирается делать, вместо того, чтобы допускать невидимое и неожиданное поведение.
Ответ 2
В основном в блоках JavaScript ({ ... }
) не вводится новая область видимости, существует только область функций, поэтому никакая другая область не создается.
Переменная, введенная где угодно в функции, видима всюду в функции.
Например:
function myFunction(){
var one = 1;
if (one){
var two = one + 1;
}
(function () {
var three = one + two;
})();
// at this point both variables *one* and *two* are accessible but
// the variable *three* was declared in the scope of a inner function
// and is not accessible at this point.
}
В языках с областью блока рекомендуется объявлять переменные в точке первого использования, но поскольку JavaScript не имеет области блока, лучше объявить все функциональные переменные в верхней части функции.
Проверьте статью.
Ответ 3
Отсутствие области блока объясняет следующий код:
var a = 1;
if (something) {
var a = 2;
}
alert(a); // Alerts "2"
В большинстве языков C-стиля (как в синтаксисе) определение var a = 2
будет определять "a" только для области if
. Использование одного оператора var в верхней части функции помогает избежать этого причуда Javascript, что не всегда так очевидно, как указано выше, и было бы неожиданным для программистов на C/С#/Java.
Ответ 4
Да, это означает, что вы объявляете все переменные в начале функции. Если вы хотите сделать это в одной строке или нескольких строках, это вопрос выбора.
Причина объясняется в указанном вами параграфе. Переменные Javascript имеют только область действия уровня. Если вы объявите одну и ту же переменную внутри блока if/while/for, она будет перезаписана новым значением, так как блок не несет новую область. Это отличается от языков, таких как Java. Чтобы избежать таких неожиданностей, объявите все переменные, которые вы собираетесь использовать в функции в начале функции, чтобы вы случайно не "переделали" и все.