Подтвердить что ты не робот

Один var для функции в JavaScript?

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

От jslint.com:

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

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

var foo = 1, bar = 2;

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

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

4b9b3361

Ответ 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. Чтобы избежать таких неожиданностей, объявите все переменные, которые вы собираетесь использовать в функции в начале функции, чтобы вы случайно не "переделали" и все.