Jshint: loopfunc & let/const

Dibuat pada 15 Feb 2017  ·  7Komentar  ·  Sumber: jshint/jshint

Beberapa masalah (#1301 dan #2225, mungkin yang lain) menyatakan bahwa ini telah diselesaikan, tetapi 2.9.4 masih memperingatkan tentang fungsi dalam loop dengan yang berikut:

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

Komentar yang paling membantu

Saya akan menggunakan metode @stevenventimiglia , membungkus fungsi "menyinggung" saya dengan konfigurasi in-line, menghidupkan dan mematikan loopfunc lenience di mana saya tahu kode saya secara referensial terdengar.

Karena itu, saya pikir saya akan memberikan satu contoh lebih lanjut untuk menyoroti di mana aturan ini memiliki beberapa celah:

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

Fungsi di atas tidak ada gunanya. Tetapi, yang terpenting, tidak ada nilai dalam loop yang merujuk variabel apa pun di luar loop. Namun jshint memberikan peringatan:

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

Hanya berpikir saya akan menyalakan api dengan menunjukkan bahwa peringatan ini dapat dipanggil pada situasi yang secara leksikal terdengar.

Semua 7 komentar

Terima kasih atas laporannya! Terlepas dari komentar tentang masalah yang Anda rujuk, saya
tidak dapat menemukan versi JSHint di mana perilaku ini pernah santai dengan benar.

Juga: contoh terakhir yang Anda bagikan adalah kasus khusus yang seharusnya tidak
diizinkan:

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

Fakta bahwa pengikatan i kebetulan dicakup secara leksikal sebenarnya tidak
melindungi dari kesalahan loopfunc awalnya diterapkan untuk menghindari.
Penulis dan pembaca kode seperti itu mungkin berharap bahwa setiap fungsi memiliki
mengikat i , tetapi pada kenyataannya, mereka semua berbagi pengikatan yang sama. Jika seseorang
dapat membantu dengan bug ini, jangan lupa untuk memperhitungkannya
kasus.

Juga: contoh terakhir yang Anda bagikan adalah kasus khusus yang tidak boleh diizinkan:

Anda benar sekali... Betapa konyolnya saya... ^__^
Tentang masalah sebenarnya, apakah kita memiliki harapan untuk menerapkan ini?

Kami tidak memiliki harapan apa pun saat ini. Apakah Anda ingin membantu?

Hanya untuk mengatakan bagi siapa pun yang mengalami ini: Masalah ini tetap ada di jshint 2.9.5.

Kode kesalahan yang dihasilkannya adalah W083.

@overlookmotel - Telah mengalami masalah yang sama selama lebih dari lima tahun.

Rekomendasi saya adalah menempatkan /*jshint loopfunc: true */ di bagian atas file .js Anda, atau menambahkan "loopfunc" : true, ke pengaturan .jshintrc . Itu tidak benar-benar memperbaiki masalah, tetapi jika belum diselesaikan setelah 5+ tahun berlalu, itu bukan sesuatu yang dapat atau akan diatasi dalam waktu dekat.

Saya akan menggunakan metode @stevenventimiglia , membungkus fungsi "menyinggung" saya dengan konfigurasi in-line, menghidupkan dan mematikan loopfunc lenience di mana saya tahu kode saya secara referensial terdengar.

Karena itu, saya pikir saya akan memberikan satu contoh lebih lanjut untuk menyoroti di mana aturan ini memiliki beberapa celah:

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

Fungsi di atas tidak ada gunanya. Tetapi, yang terpenting, tidak ada nilai dalam loop yang merujuk variabel apa pun di luar loop. Namun jshint memberikan peringatan:

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

Hanya berpikir saya akan menyalakan api dengan menunjukkan bahwa peringatan ini dapat dipanggil pada situasi yang secara leksikal terdengar.

@andrew-st-angelo-77media Kerja bagus melaporkan itu. Saya baru saja mendapatkan kesalahan yang sama persis, meskipun fungsi saya tidak mereferensikan variabel lingkup luar apa pun. Saya berharap ini akan diurus.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

fbarda picture fbarda  ·  5Komentar

MtDalPizzol picture MtDalPizzol  ·  7Komentar

strugee picture strugee  ·  8Komentar

ghost picture ghost  ·  5Komentar

nzakas picture nzakas  ·  10Komentar