Одна переменная на функцию в JavaScript? - PullRequest
51 голосов
/ 06 августа 2009

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

С jslint.com :

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

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

var foo = 1, bar = 2;

И, является ли «мудрая» часть просто стилем программирования для предотвращения ошибок в будущем или есть что-то большее?

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

Ответы [ 4 ]

72 голосов
/ 06 августа 2009

Проблема в том, что, понимаете ли вы это или нет, 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, заключается в том, что он делает код визуально совпадающим с тем, что он собирается делать, вместо того, чтобы допустить невидимое и неожиданное поведение.

8 голосов
/ 06 августа 2009

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

Отметьте статью .

6 голосов
/ 06 августа 2009

Отсутствие области видимости блока объясняет код ниже:

var a = 1;
if (something) {
    var a = 2;
}

alert(a); // Alerts "2"

В большинстве языков стиля C (как в синтаксисе) определение var a = 2 будет определять 'a' только для области действия блока if. Использование одного оператора var в верхней части функции помогает избежать этой причуды Javascript, которая не всегда так очевидна, как приведенная выше, и будет неожиданной для программистов на C / C # / Java.

4 голосов
/ 06 августа 2009

Да, это означает, что вы объявляете все переменные в начале функции. Если вы хотите сделать это в одну или несколько строк, это вопрос выбора.

Причина объяснена в упомянутом вами абзаце. Переменные Javascript имеют только область действия на уровне функций. Если вы объявите ту же переменную внутри блока if / while / for, она будет перезаписана новым значением, так как блок не несет новую область видимости. Это отличается от языков, таких как Java. Чтобы избежать таких неожиданностей, объявите все переменные, которые вы собираетесь использовать в функции, в начале функции, чтобы случайно не переопределить и прочее.

...