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

Ошибка JsLint "вне видимости"

function test(){
    if(true){
        var a = 5;
    }
    alert(a);
}

test();

Я продолжаю получать ошибки "вне видимости" в моем JS-коде, когда я проверяю JsLint, который не имеет смысла для меня. Поэтому я быстро создал пример. Есть ли что-то действительно неправильное с этой частью кода, так как переменная в конечном итоге поднимается на вершину функции в любом случае.

4b9b3361

Ответ 1

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

Используя ключевое слово var внутри блока if, но получая доступ к переменной вне этого блока, вы создали конструкцию, которая может сбить с толку людей, не знакомых с этой особенностью JS.

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

function test(){
    var a;
    if(true){
        a = 5;
    }
    alert(a);
}

test();

С несколькими переменными у вас будет:

function foo () {
    var a, b, c, d = "only d has an initial value", e;
    // …
}

Ответ 2

Код, который вы написали, работает. Это просто не очень удобочитаемо. Объявление переменной a внутри области if может дать ложное впечатление о том, что a видна только внутри этой области (которая, как показывает эта программа, не соответствует истине) - a будет отображаться в течение всего функция).

Это предупреждение JsLint побуждает вас размещать объявление в точном объеме, где фактически используется переменная, следующим образом:

function test(){
  var a;
  if(true){
      a = 5;
  }
  alert(a);
}