2010-03-20 5 views
26
function test(){ 
    if(true){ 
     var a = 5; 
    } 
    alert(a); 
} 

test(); 

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

+0

поэтому его больше предупреждение. – Rajat

+2

Многие из «ошибок» JSLint на самом деле являются просто предупреждениями в том смысле, что они не являются ошибками языка JavaScript и не обязательно будут работать во время выполнения. Они называются ошибками, потому что Дуглас Крокфорд считает их плохой практикой. –

ответ

34

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

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

Douglas Crockford recommends с использованием одного оператора 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; 
    // … 
} 
+14

Douglas Crockford рекомендует * многое из вещей ... как с любым инструментом, вы всегда должны принимать рекомендации JSLint с солью и адаптировать их к вам/вашей команде. Если каждый из вашей команды понимает, как работает область видимости переменной JS, вы обязательно должны игнорировать рекомендации Крокфорда о том, где поставить ваши заявления «var»). – machineghost

5

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

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

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

Umm ... 'var = null' ?? – Quentin

+0

Предположительно, это опечатка и должна быть «var a = null». – eyelidlessness

+0

Спасибо, исправил. –

1

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

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

Смежные вопросы