Jshint: loopfunc & let / const

Criado em 15 fev. 2017  ·  7Comentários  ·  Fonte: jshint/jshint

Alguns problemas (# 1301 e # 2225, talvez outros) afirmam que isso foi resolvido, mas 2.9.4 ainda avisam sobre a função em loops com o seguinte:

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

Comentários muito úteis

Estarei utilizando o método de

Dito isso, pensei em fornecer mais um exemplo para destacar onde esta regra tem algumas lacunas:

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

A função acima não faz nada de útil. Mas, o mais importante, nenhum dos valores no loop faz referência a quaisquer variáveis ​​fora do loop. E ainda assim jshint lança o aviso:

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

Apenas pensei em atiçar o fogo apontando que este aviso pode ser chamado em situações lexicamente corretas.

Todos 7 comentários

Obrigado pelo relatório! Apesar dos comentários sobre os problemas que você mencionou, eu
não consigo encontrar uma versão do JSHint em que esse comportamento tenha sido relaxado corretamente.

Além disso: o exemplo final que você compartilhou é um caso especial que não deveria ser
permitido:

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

O fato de a ligação i ter um escopo léxico não
proteger contra o erro loopfunc foi originalmente implementado para evitar.
Autores e leitores de código como esse podem esperar que cada função tenha um
vinculação i dedicada, mas, na verdade, todas compartilham a mesma vinculação. Se alguém
é capaz de ajudar com este bug, por favor, não se esqueça de levar em conta isso
caso.

Além disso: o exemplo final que você compartilhou é um caso especial que não deveria ser permitido:

Você está completamente certo ... Que bobo da minha parte ... ^ __ ^
Sobre o problema real, temos alguma expectativa de implementar isso?

Não temos nenhuma expectativa no momento. Você gostaria de ajudar?

Apenas para dizer para qualquer um que encontrar isso: Esse problema permanece no jshint 2.9.5.

O código de erro que ele produz é W083.

@overlookmotel - Experimenta o mesmo problema há mais de cinco anos.

Minha recomendação é colocar /*jshint loopfunc: true */ no topo do seu arquivo .js ou adicionar "loopfunc" : true, às suas configurações de .jshintrc . Isso realmente não corrige o problema, mas se não for resolvido após 5 anos ou mais, não é algo que pode ou será resolvido em breve.

Estarei utilizando o método de

Dito isso, pensei em fornecer mais um exemplo para destacar onde esta regra tem algumas lacunas:

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

A função acima não faz nada de útil. Mas, o mais importante, nenhum dos valores no loop faz referência a quaisquer variáveis ​​fora do loop. E ainda assim jshint lança o aviso:

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

Apenas pensei em atiçar o fogo apontando que este aviso pode ser chamado em situações lexicamente corretas.

@ andrew-st-angelo-77media Bom trabalho em relatar isso. Estou recebendo exatamente o mesmo erro, embora minha função não faça referência a nenhuma variável de escopo externo. Espero que isso seja resolvido.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

jugglinmike picture jugglinmike  ·  6Comentários

damyanpetev picture damyanpetev  ·  4Comentários

ghost picture ghost  ·  5Comentários

SidNM picture SidNM  ·  7Comentários

fbarda picture fbarda  ·  5Comentários