Ошибка JsLint «вне области видимости» - PullRequest
27 голосов
/ 21 марта 2010
function test(){
    if(true){
        var a = 5;
    }
    alert(a);
}

test();

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

Ответы [ 3 ]

34 голосов
/ 21 марта 2010

В то время как 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;
    // …
}
5 голосов
/ 21 марта 2010

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

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

function test(){
  var a;
  if(true){
      a = 5;
  }
  alert(a);
}
1 голос
/ 24 февраля 2018

Javascript имеет область действия функции, а не область блока. Итак, переменные, объявленные внутри if, видны и доступны вне блока if и внутри функции, в которой объявлен оператор if.

Онлайн-компиляторы, такие как JSLint и jsbin, выдают предупреждения, но не являются ошибками.

...