Один var на функцию в JavaScript?
Я использую JSLint, чтобы заставить меня чувствовать себя плохо о моем JavaScript. Это здорово, кстати. Есть одна проверка, которую я не совсем понимаю, и мне бы хотелось узнать ваше мнение, пожалуйста.
от jslint.com:
в языках с блочной областью обычно рекомендуется объявлять переменные на месте первого использования. Но поскольку JavaScript не имеет области видимости блока, разумнее объявить все переменные функции в верхней части функция. рекомендуется использовать один оператор var для каждой функции.
что на самом деле говорит последнее предложение жирным шрифтом? Я думаю, что я должен объявить несколько переменных, как это?
var foo = 1, bar = 2;
и, является ли "мудрая" часть просто стилем программирования, чтобы препятствовать ошибкам вниз по линии или есть больше, чем это?
Спасибо за вашу помощь.
4 ответа:
проблема в том, что, независимо от того, осознаете вы это или нет, javascript невидимо перемещает все объявления var в верхнюю часть области функции.
Так что если у вас есть такая функция
var i = 5; function testvar () { alert(i); var i=3; } testvar();
окно предупреждения будет содержать неопределенное значение. потому что внутренне, это было изменено в это:
var i = 5; function testvar () { var i; alert(i); i=3; } testvar();
это называется "подъем". Причина, по которой Крокфорд так сильно защищает объявления var, заключается в том, что он делает код явно соответствующим тому, что он есть собираюсь сделать, вместо того, чтобы позволить невидимому и неожиданному поведению произойти.
в основном в блоках 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 не имеет блочной области, лучше объявить все a функции переменные в верхней части функции.
проверить это статьи.
отсутствие области блока объясняет код ниже:
var a = 1; if (something) { var a = 2; } alert(a); // Alerts "2"
в большинстве языков C-стиля (как и в синтаксисе),
var a = 2
определение определило бы " a " только для областиif
блок. Использование одного оператора var в верхней части функции помогает избежать этой причуды Javascript, которая не всегда так очевидна, как выше, и была бы неожиданной для программистов C/C#/Java.
Да, это означает, что вы объявлять все переменные в начале функции. Хотите ли вы сделать это в одной строке или в нескольких строках-это вопрос выбора.
причина объясняется в пункте, который вы упомянули. Переменные в JavaScript есть только функция уровне области. Если вы объявите ту же переменную внутри блока if/while/for, она будет перезаписана новым значением, поскольку блок не несет новую область. Это отличается от таких языков, как Java. Избегать такие сюрпризы, объявляют все переменные, которые вы собираетесь использовать в функции в начале функции, чтобы вы случайно не "объявили" andything.