validador sintaxis script online eslinter javascript jslint

javascript - sintaxis - Error ''fuera de alcance'' de JsLint



sintaxis js online (3)

El código que escribiste está funcionando. Simplemente no es muy legible / mantenible. Declarar la variable a dentro del alcance del if puede dar la falsa impresión de que a solo es visible dentro de este alcance (lo que, como muestra este programa, no es cierto: a será visible en toda la función).

Esta advertencia de JsLint lo alienta a colocar la declaración en el alcance exacto donde se usa la variable, de la siguiente manera:

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

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

Sigo obteniendo errores "fuera de alcance" en mi código JS cuando verifico con JsLint, lo cual no tiene sentido para mí. Así que rápidamente creé un ejemplo. ¿Hay algo realmente malo con esta pieza de código, ya que la variable finalmente se eleva a la parte superior de la función de todos modos?


Javascript tiene función de alcance y no bloque de alcance. Por lo tanto, las variables declaradas dentro de la función if son visibles y accesibles fuera del bloque if y dentro de la función en la que se declara if.

Los compiladores en línea como JSLint y jsbin dan advertencias pero no son errores.


Mientras que var localiza una variable para la función y está sujeta a elevación, la mayoría de los lenguajes tienen un alcance de bloque y no un alcance de función.

Al utilizar la palabra clave var dentro de un bloque if, pero accediendo a la variable fuera de ese bloque, ha creado una construcción que puede confundir a las personas que no están familiarizadas con esa idiosincrasia JS.

Douglas Crockford recomienda el uso de una sola sentencia var en la parte superior de una función que especifica todas las variables que deben estar dentro del alcance de esa función.

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

Con múltiples variables tendrías:

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