Ошибка JsLint "вне видимости"
function test(){
if(true){
var a = 5;
}
alert(a);
}
test();
Я продолжаю получать ошибки "вне видимости" в моем JS-коде, когда я проверяю JsLint, который не имеет смысла для меня. Поэтому я быстро создал пример. Есть ли что-то действительно неправильное с этой частью кода, так как переменная в конечном итоге поднимается на вершину функции в любом случае.
Ответы
Ответ 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);
}