Jshint: loopfunc & let / const

Creado en 15 feb. 2017  ·  7Comentarios  ·  Fuente: jshint/jshint

Algunos problemas (# 1301 y # 2225, tal vez otros) indican que esto se resolvió, pero 2.9.4 aún advierte sobre la función en bucles con lo siguiente:

const a = [], b = [];
for (let i in b) a.push(() => i);
for (let i of b) a.push(() => i);
for (let i = 0; i < 10; i++) a.push(() => i);

let i = 0;
while (i++ < 10) a.push(() => i);
P2

Comentario más útil

Utilizaré el método de

Dicho esto, pensé en proporcionar un ejemplo más para resaltar dónde esta regla tiene algunas lagunas:

function foo(myLoopArr)
{
    /* globals Promise: false */
    for(let val in myLoopArr)
    {
        const myPromArr = [];
        myPromArr.push(function() {
            return new Promise();
        });
    }
}

La función anterior no sirve para nada. Pero, lo que es más importante, ninguno de los valores en el ciclo hace referencia a ninguna variable fuera del ciclo. Y, sin embargo, jshint lanza la advertencia:

 myPromArr.push(function() {
                                ^ Functions declared within loops referencing an outer scoped variable may lead to confusing semantics.

Solo pensé en avivar el fuego al señalar que esta advertencia puede ser invocada en situaciones léxicamente sólidas.

Todos 7 comentarios

¡Gracias por el informe! A pesar de los comentarios sobre los problemas a los que ha hecho referencia,
No puedo encontrar una versión de JSHint en la que este comportamiento se haya relajado correctamente.

Además: el ejemplo final que compartió es un caso especial que no debería ser
permitido:

let i = 0;
while (i++ < 10) a.push(() => i);

El hecho de que el enlace i tenga un alcance léxico no
proteger contra el error loopfunc originalmente implementado para evitarlo.
Los autores y lectores de código como ese pueden esperar que cada función tenga una
enlace dedicado i , pero de hecho, todos comparten el mismo enlace. Si alguien
puede ayudar con este error, no olvides tener en cuenta eso
caso.

Además: el ejemplo final que compartió es un caso especial que no debería permitirse:

Tienes toda la razón ... Qué tonto soy ... ^ __ ^
Sobre el problema real, ¿tenemos alguna expectativa de implementar esto?

No tenemos ninguna expectativa por el momento. ¿Te gustaría ayudar?

Solo para decirle a cualquiera que se encuentre con esto: este problema permanece en jshint 2.9.5.

El código de error que produce es W083.

@overlookmotel :

Mi recomendación es colocar /*jshint loopfunc: true */ en la parte superior de su archivo .js, o agregar "loopfunc" : true, a su configuración .jshintrc . Realmente no soluciona el problema, pero si no se ha resuelto después de que hayan pasado más de 5 años, no es algo que pueda o se abordará pronto.

Utilizaré el método de

Dicho esto, pensé en proporcionar un ejemplo más para resaltar dónde esta regla tiene algunas lagunas:

function foo(myLoopArr)
{
    /* globals Promise: false */
    for(let val in myLoopArr)
    {
        const myPromArr = [];
        myPromArr.push(function() {
            return new Promise();
        });
    }
}

La función anterior no sirve para nada. Pero, lo que es más importante, ninguno de los valores en el ciclo hace referencia a ninguna variable fuera del ciclo. Y, sin embargo, jshint lanza la advertencia:

 myPromArr.push(function() {
                                ^ Functions declared within loops referencing an outer scoped variable may lead to confusing semantics.

Solo pensé en avivar el fuego al señalar que esta advertencia puede ser invocada en situaciones léxicamente sólidas.

@ andrew-st-angelo-77media Buen trabajo informando eso. Recibo exactamente el mismo error, aunque mi función no hace referencia a ninguna variable de ámbito externo. Espero que esto se solucione.

¿Fue útil esta página
0 / 5 - 0 calificaciones