Один var на функцию в JavaScript?


Я использую JSLint, чтобы заставить меня чувствовать себя плохо о моем JavaScript. Это здорово, кстати. Есть одна проверка, которую я не совсем понимаю, и мне бы хотелось узнать ваше мнение, пожалуйста.

от jslint.com:

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

что на самом деле говорит последнее предложение жирным шрифтом? Я думаю, что я должен объявить несколько переменных, как это?

var foo = 1, bar = 2;

и, является ли "мудрая" часть просто стилем программирования, чтобы препятствовать ошибкам вниз по линии или есть больше, чем это?

Спасибо за вашу помощь.

4   51  

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.