Jshint: loopfunc и let / const

Созданный на 15 февр. 2017  ·  7Комментарии  ·  Источник: jshint/jshint

В некоторых проблемах (# 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);

Самый полезный комментарий

Я буду использовать метод @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.

Просто подумал, что разожгу огонь, указав, что это предупреждение может вызываться в лексически правильных ситуациях.

Все 7 Комментарий

Спасибо за отчет! Несмотря на комментарии по указанным вами вопросам, я
не могу найти версию 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 Хорошая работа, сообщая об этом. Я получаю точно такую ​​же ошибку, хотя моя функция не ссылается ни на какие внешние переменные с ограниченной областью видимости. Я надеюсь, что об этом позаботятся.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги