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);
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.
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:
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:
Apenas pensei em atiçar o fogo apontando que este aviso pode ser chamado em situações lexicamente corretas.