В некоторых проблемах (# 1301 и # 2225, возможно, другие) говорится, что это было решено, но 2.9.4 по-прежнему предупреждает о функции в циклах следующим образом:
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);
Спасибо за отчет! Несмотря на комментарии по указанным вами вопросам, я
не могу найти версию JSHint, в которой это поведение когда-либо было
Также: последний пример, которым вы поделились, - это особый случай, который не должен быть
разрешается:
let i = 0;
while (i++ < 10) a.push(() => i);
Тот факт, что привязка i
имеет лексическую область видимости, на самом деле не
защита от ошибки loopfunc
изначально была реализована для предотвращения.
Авторы и читатели подобного кода могут ожидать, что каждая функция имеет
выделенная i
привязка, но на самом деле все они имеют одну и ту же привязку. Если кто-нибудь
может помочь с этой ошибкой, пожалуйста, не забудьте учесть это
кейс.
Также: последний пример, которым вы поделились, - это особый случай, который нельзя допускать:
Вы совершенно правы ... Какая глупость с моей стороны ... ^ __ ^
Что касается реальной проблемы, ожидаем ли мы, что это будет реализовано?
На данный момент у нас нет никаких ожиданий. Хотели бы вы помочь?
Просто скажу всем, кто сталкивается с этим: эта проблема остается в jshint 2.9.5.
Код ошибки, который он выдает, - W083.
@overlookmotel -
Я рекомендую либо разместить /*jshint loopfunc: true */
в верхней части файла .js, либо добавить "loopfunc" : true,
в настройки .jshintrc
. На самом деле это не решает проблему, но если она не была решена по прошествии 5+ лет, это не то, что можно или будет решать в ближайшее время.
Я буду использовать метод @steventimiglia , оборачивая мою "оскорбительную" функцию встроенными конфигурациями, включая и выключая смягчение функции loopfunc там, где я знаю, что мой код ссылочно исправен.
Тем не менее, я подумал, что приведу еще один пример, чтобы подчеркнуть, где в этом правиле есть некоторые пробелы:
function foo(myLoopArr)
{
/* globals Promise: false */
for(let val in myLoopArr)
{
const myPromArr = [];
myPromArr.push(function() {
return new Promise();
});
}
}
Вышеупомянутая функция не делает ничего полезного. Но, что важно, ни одно из значений в цикле не ссылается на какие-либо переменные вне цикла. И все же jshint выдает предупреждение:
myPromArr.push(function() {
^ Functions declared within loops referencing an outer scoped variable may lead to confusing semantics.
Просто подумал, что разожгу огонь, указав, что это предупреждение может вызываться в лексически правильных ситуациях.
@ andrew-st-angelo-77media Хорошая работа, сообщая об этом. Я получаю точно такую же ошибку, хотя моя функция не ссылается ни на какие внешние переменные с ограниченной областью видимости. Я надеюсь, что об этом позаботятся.
Самый полезный комментарий
Я буду использовать метод @steventimiglia , оборачивая мою "оскорбительную" функцию встроенными конфигурациями, включая и выключая смягчение функции loopfunc там, где я знаю, что мой код ссылочно исправен.
Тем не менее, я подумал, что приведу еще один пример, чтобы подчеркнуть, где в этом правиле есть некоторые пробелы:
Вышеупомянутая функция не делает ничего полезного. Но, что важно, ни одно из значений в цикле не ссылается на какие-либо переменные вне цикла. И все же jshint выдает предупреждение:
Просто подумал, что разожгу огонь, указав, что это предупреждение может вызываться в лексически правильных ситуациях.