Jshint: Peringatan "Jangan membuat fungsi dalam satu lingkaran" hanya untuk fungsi yang mereferensikan variabel luar?

Dibuat pada 26 Okt 2016  ·  14Komentar  ·  Sumber: jshint/jshint

Saya tidak yakin apakah ini perilaku yang diharapkan, hanya aneh bagi saya bahwa peringatan untuk "Jangan membuat fungsi dalam satu lingkaran" hanya memperingatkan untuk beberapa fungsi yang dibuat di dalam satu lingkaran.

(function(){
  for(var i=0; i<5; ++i){
    var age = 9001;
    //This has a jshint warning, as it uses age
    var cutoffs = [1800,12000].map(function(cutoff){
      return cutoff < age;
    });
    //but this doesn't cause a warning, despite creating a function inside a loop
    var cutoffs2 = [1800,12000].map(function(cutoff){
      return cutoff < 42;
    });
  }
})();
Docs Issue Has PR

Komentar yang paling membantu

JSHint tidak menyimpulkan bahwa iterasi sedang terjadi dalam kasus panggilan balik forEach .

Semua 14 komentar

Diharapkan, karena fungsi yang tidak mereferensikan vars luar tidak dapat memberikan hasil yang tidak diharapkan:

for (var i = 0; i < 3; i++) {
  var x = i * 2;
  setImmediate(function() {
    console.log(x); // This logs 4, 4 and 4
  });
}

for (var i = 0; i < 3; i++) {
  var x = i * 2;
  setImmediate(function(x) {
    return function() {
      console.log(x); // This logs 0, 2 and 4 (because x isn't defined in the for's scope
    };
  }(i * 2));
}

Ya, saya tahu itu adalah hal yang harus diwaspadai, tetapi peringatannya bukan "jangan gunakan vars luar, mungkin memiliki perilaku yang tidak terduga", peringatannya adalah "jangan membuat fungsi dalam satu lingkaran", yang tidak sama hal sama sekali.

Terima kasih atas laporannya! Peringatan ini awalnya dilaporkan untuk _all_ functions
dalam satu lingkaran. Tidak sampai gh-1887 (dirilis dalam versi 2.5.7) bahwa
peringatan terbatas pada kasus-kasus tertentu sesuai dengan ikatan di sekitarnya
tertutup. Teksnya mungkin juga harus diperbarui pada saat itu.
@mtfurlan apakah Anda ingin mencoba menulis ulang pesan?

Mungkin sesuatu seperti

"Fungsi di dalam loop menggunakan variabel luar dapat menyebabkan hasil yang tidak diinginkan, pahami apa yang Anda lakukan."

Entah apakah itu cocok dengan nada jshint, saya baru mulai menggunakannya baru-baru ini. Silakan modifikasi seperlunya.

Sesuatu seperti

"Fungsi yang dideklarasikan di dalam loop menggunakan variabel luar dapat menyebabkan hasil yang tidak diinginkan, pahami apa yang Anda lakukan."

akan secara akurat menggambarkan peringatan itu, saya pikir.

Itu lebih baik! Saya punya beberapa ide tambahan:

  • "hasil yang tidak diinginkan" agak kabur. Sesuatu di sepanjang garis
    "kebingungan tentang nilai-nilai yang mengikat" akan lebih jelas menggambarkan maksudnya
  • Saran untuk "memahami apa yang Anda lakukan," tidak terlalu membantu
    dan bahkan mungkin dianggap merendahkan oleh beberapa pengguna (orang bisa jadi sensitif
    tentang kode mereka!)

Jadi apa yang Anda pikirkan tentang:

Fungsi yang dideklarasikan di dalam loop yang mereferensikan variabel dalam lingkup luar
dapat menyebabkan kebingungan tentang nilai pengikatan.

Yah itu tidak jauh lebih membantu daripada "hasil yang tidak diinginkan", tetap saja
tidak menjelaskannya jika Anda belum tahu apa yang terjadi.

Mungkin tautan singkat ke penjelasan lengkap?

Pada 30 Oktober 2016 16:50, "jugglinmike" [email protected] menulis:

Itu lebih baik! Saya punya beberapa ide tambahan:

  • "hasil yang tidak diinginkan" agak kabur. Sesuatu di sepanjang garis
    "kebingungan tentang nilai-nilai yang mengikat" akan lebih jelas menggambarkan maksudnya
  • Saran untuk "memahami apa yang Anda lakukan," bukanlah
    sangat membantu dan bahkan mungkin dianggap merendahkan oleh beberapa pengguna
    (orang bisa peka tentang kode mereka!)

Jadi apa yang Anda pikirkan tentang:

Fungsi yang dideklarasikan di dalam loop yang mereferensikan variabel dalam lingkup luar
dapat menyebabkan kebingungan tentang nilai pengikatan.


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/jshint/jshint/issues/3056#issuecomment -257178068, atau bisukan
benang
https://github.com/notifications/unsubscribe-auth/ABJyGpxcErFKI0UDb9WGx9WsXiIlWUYCks5q5QL4gaJpZM4Khix5
.

Mungkin:

Fungsi yang dideklarasikan dalam loop yang merujuk pada variabel lingkup luar dapat menyebabkan semantik yang ambigu

atau

Fungsi yang dideklarasikan dalam loop yang merujuk pada variabel lingkup luar dapat menyebabkan semantik yang membingungkan

Adapun tautan ke penjelasan yang lebih rinci, ini sebenarnya bukan pekerjaan jshint (imo), dan juga memerlukan penjelasan halaman statis; posting blog dll. dapat dihapus atau diubah, artinya konten yang dirujuk sudah tidak ada lagi atau tidak valid.

Ya, tautan bukanlah ide terbaik. Selama itu peringatan unik, seseorang akan membuat posting blog dan ditautkan oleh google.

Saya suka saran kedua Anda.

@iamlikeme-x ditindaklanjuti dengan tambalan untuk meningkatkan pesan (lihat gh-3058), dan yang kemudian dirilis di JSHint versi 2.9.5. Terima kasih atas bantuannya, teman-teman!

Hai. Kode berikut masih memberikan pesan ("Fungsi yang dideklarasikan dalam loop yang merujuk pada variabel cakupan luar dapat menyebabkan semantik yang membingungkan.") Mengapa?

function getPromise(ms){
    return new Promise(function(resolve){
        setTimeout(function(){
            resolve (ms);
        }, ms);
    });
}

var a = [1000,2000,3000];
a.forEach(function(elem){
    getPromise(elem).then(function(d){
        console.log(d);
    });
});

var a = [1500,2500,3500];
for (var index in a){
    getPromise(a[index]).then(function/* here */(d){ 
        console.log(d);
    });
}

jshint v2.10.2

@nova76 Pesan peringatan lengkap menyertakan nama variabel:

Functions declared within loops referencing an outer scoped variable may lead to confusing semantics. (console)

Anda dapat menghindari ini dengan memberi tahu JSHint bahwa console tidak akan berubah:

/* globals console: false */

Meskipun perhatikan bahwa jika Anda akhirnya menetapkan kembali variabel itu di tempat lain, konfigurasi ini akan menyebabkan JSHint memperingatkan tentang penugasan kembali.

@jugglinmike
Ada dua contoh serupa. Yang pertama (untuk Setiap) sempurna, hanya yang kedua (Untuk) yang rusak. Mengapa? Apa bedanya?

JSHint tidak menyimpulkan bahwa iterasi sedang terjadi dalam kasus panggilan balik forEach .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

Guichaguri picture Guichaguri  ·  8Komentar

SidNM picture SidNM  ·  7Komentar

voronianski picture voronianski  ·  8Komentar

stefanuddenberg picture stefanuddenberg  ·  7Komentar

nzakas picture nzakas  ·  10Komentar