Jshint: *Hal ini* diperlukan untuk menginisialisasi 'x' menjadi 'tidak terdefinisi'.

Dibuat pada 22 Jan 2014  ·  19Komentar  ·  Sumber: jshint/jshint

Lihat tes sederhana berikut

for( var i = 0; i < 10; i++ )
{
    var x = undefined;

    if( i % 2 === 0 )
    {
        x = null;
    }

    if( x === undefined )
    {
        console.log( i );
    }
}

hasilnya adalah seperti yang dapat dengan mudah ditebak:

3
5
7
9

jshint mengeluh bahwa:
test.js: baris 3, col 9, Tidak perlu menginisialisasi 'x' ke 'undefined'.

Namun,

for( var i = 0; i < 10; i++ )
{
    var x;

    if( i % 2 === 0 )
    {
        x = null;
    }

    if( x === undefined )
    {
        console.log( i );
    }
}

akan menghasilkan pada V8 (chrome dan node)
hanya


Karena x tidak akan disetel ulang menjadi tidak terdefinisi pada setiap interaksi loop.

( jshint v2.4.2)

Komentar yang paling membantu

:thumbsup: bukan kesalahan untuk menginisialisasi variabel ke undefined

Semua 19 komentar

Dikonfirmasi.

var x; pada contoh kedua sedang diangkat , tetapi tidak meninggalkan penugasan apa pun, sedangkan contoh pertama meninggalkan penugasan ke undefined .

:thumbsup: bukan kesalahan untuk menginisialisasi variabel ke undefined

Ini aturan yang aneh.

+1

Inisialisasi eksplisit ke undefined tidak berguna karena ini adalah perilaku javascript default.
Masalahnya di sini adalah bahwa javascript tidak memiliki cakupan blok.
x harus diinisialisasi ke undefined pada setiap iterasi.
Kode berikut berperilaku seperti yang diharapkan dan jshint tidak mengeluh:

var x;
for( var i = 0; i < 10; i++ )
{
    x = undefined;

    if( i % 2 === 0 )
    {
        x = null;
    }

    if( x === undefined )
    {
        console.log( i );
    }
}

Saya tahu, tetapi sampel kode pertama saya juga bagus, namun jshint salah mengeluh.

Saya tahu, tetapi sampel kode pertama saya juga bagus

Ini adalah kesalahannya: JSHint sedang mengidentifikasi praktik buruk sehingga Anda dapat memperbaikinya. Jika Anda ingin mengabaikan saran JSHint, beri tahu JSHint bahwa:

/* jshint -W080 */

Contoh pertama saya BUKAN praktik yang buruk! Kode oke yang sempurna! Satu-satunya yang salah di sini adalah jshint.

Menyetel vars dalam deklerasinya ke undefined adalah praktik yang buruk HANYA jika tidak dalam satu lingkaran, karena pengangkatan.

Dan -W080 mengubah pengaturan _all_ menjadi kesalahan yang tidak ditentukan, di luar loop itu peringatan yang bagus, di dalamnya tidak.

Juga masalahnya bukan gaya berdebat jika itu ide yang baik untuk secara manual mengangkat deklarasi variabel, masalahnya adalah bahwa jshint menasihati orang memecahkan kode kerja!

+1 @axkibe

Saya setuju dengan @axkibe : Ini kode javascript yang benar! Melakukannya atau tidak hanyalah masalah selera.
Tetapi memperbaiki kode agar sesuai dengan JSHint bukanlah penggantian mekanis.
JSHint tidak saran. Adalah tugas pengembang untuk memilih cara memperbaiki kode. Faktanya adalah bahwa untuk kode loop dalam, ide pertama memecah kode...
Saya dapat memahami bahwa ini adalah praktik yang buruk karena perilaku default dari deklarasi variabel.
Tetapi karena JS tidak memiliki cakupan blok, itu mengarah pada penulisan kode dengan cara yang tidak wajar, mengangkat deklarasi variabel hanya untuk menghindari JSHint untuk mengeluh.
Akan menyenangkan juga dapat menggunakan arahan seperti /* jshint -W080 */ secara lokal ke baris dan secara lokal ke blok kode ke silent JSHint pada bagian kode yang tepat.

@rwaldron Anda mengatakan "JSHint sedang mengidentifikasi praktik buruk sehingga Anda dapat memperbaikinya".
Tujuan JSHint tidak jelas bagi saya. Kita dapat membaca di situs web JSHint

  • "Ini adalah JSHint, alat yang membantu mendeteksi kesalahan dan potensi masalah"
  • "JSHint adalah program yang menandai penggunaan yang mencurigakan dalam program yang ditulis dalam JavaScript"

Saya menemukan semua sangat menarik. Tetapi mereka harus dipisahkan:

  • kesalahan,
  • Masalah potensial,
  • Praktik buruk.

"JSHint adalah program yang menandai penggunaan yang mencurigakan dalam program yang ditulis dalam JavaScript"

Mendeklarasikan ulang pengikatan var di dalam for loop body adalah "penggunaan yang mencurigakan". Jika pembaca berasal dari bahasa lain, atau baru mengenal pemrograman, pola ini akan terlihat seperti:

  • pengikatan var untuk setiap putaran loop
  • pengikatan var dicakupkan ke badan loop for

Tidak ada yang benar, yang mencurigakan.

mengangkat deklarasi variabel hanya untuk menghindari JSHint mengeluh.

Apa gunanya menggunakan alat linting kode jika Anda tidak ingin mengikuti panduan yang diberikannya?

Akan menyenangkan juga untuk dapat menggunakan arahan seperti /* jshint -W080 */ secara lokal ke baris dan secara lokal ke blok kode ke silent JSHint pada bagian kode yang tepat.

Apakah maksud Anda seperti ini:

/* jshint -W080 */
for (var i = 0; i < 10; i++) {
  var x = undefined;

  if (i % 2 === 0) {
    x = null;
  }

  if (x === undefined) {
    console.log(i);
  }
}
/* jshint +W080 */

Atau lebih seperti ini?

for (var i = 0; i < 10; i++) {
  /* jshint -W080 */
  var x = undefined;
  /* jshint +W080 */
  if (i % 2 === 0) {
    x = null;
  }

  if (x === undefined) {
    console.log(i);
  }
}

Setelah membuka masalah ini setahun yang lalu, sementara itu gaya pengkodean javascript saya tetap berkembang jadi saya secara manual mengangkat semua variabel hari ini karena kebingungan dalam pernyataan switch dll. Saya melakukan ini seperti di atas ketika saya relatif baru datang dengan banyak pengalaman bertahun-tahun dalam C++/Java/Lua dll yang semuanya melakukan bayangan variabel waras.

Bagaimanapun masalah dengan jshint adalah, ini memberi koder panduan _wrong_.

Secara harfiah mengatakan, Anda tidak perlu mengatur variabel ke undefined di sini saat Anda memilikinya. Jika itu akan memandu Anda mengatakan seperti "hei, Anda tahu, mengangkat secara manual ini akan terlihat lebih bersih" ... oke, hari ini saya setuju, saya kira beberapa orang akan berdebat tentang hal itu. Seseorang dapat memilih jika mengaktifkan peringatan/panduan pengangkatan.

Tetapi dikatakan ' Anda harus meninggalkan itu = tidak terdefinisi', itu tidak perlu. Namun yang akan merusak kode Anda. Yang saat itu berhasil bagi saya, ketika saya belum mengetahui cara kerja variabel non-bayangan/pengangkatan di Javascript.

Juga
function a( ) { var x; x = undefined; }
haruskah IMO mengeluarkan peringatan.

sebenarnya dua. Salah satu yang x ditetapkan tidak terdefinisi bahkan setelah deklarasi, ketika belum dapat memiliki nilai lain. Peringatan kedua, variabel tidak pernah dibaca di sisi kanan, yang membuatnya 100% tidak berguna.

OMONG-OMONG:

for (var i = 0; i < 10; i++) {
  var x; x = undefined;

  if (i % 2 === 0) {
    x = null;
  }

  if (x === undefined) {
    console.log(i);
  }
}

Adalah cara yang terlihat lebih bagus untuk menghilangkan peringatan 80 ketika tidak ingin mengangkat x secara manual. Namun untuk mengulangi pendapat saya, kita tidak boleh mengarahkan orang ke jalan yang salah.

Kadang-kadang saya perlu, demi kejelasan, untuk menulis var a = undefined untuk memperjelas Saya ingin bahwa nilainya tidak terdefinisi, dan saya tidak lupa untuk menginisialisasinya.

Saya pikir perbedaan yang tidak terlalu mencolok dalam pemuatan skrip jauh lebih penting daripada kejelasan kode.

Lebih-lebih lagi:

for (var i=0; i<5; i+=1) { 
    var x = undefined; 
    console.log(x); 
    [some other code]
    x = 5; 
}

hasil:
5x tidak terdefinisi

for (var i=0; i<5; i+=1) { 
    var x; 
    console.log(x); 
    [some other code]
    x = 5; 
}

hasil:
1x tidak terdefinisi
4x 5

Oke, mendeklarasikan variabel di dalam for loop adalah praktik yang buruk, tetapi TIDAK ditandai oleh JSHint...

Saya pikir ini perlu dibuka kembali. Bimbingan di sini tampaknya buruk. V8 akan membuat kelas tersembunyi baru setiap kali Anda menambahkan parameter ke objek atau kelas. Rekomendasi yang telah saya dengar dan baca berkali-kali adalah memasukkan parameter apa pun yang Anda tahu akan Anda perlukan sejak awal.

contoh pendukung: https://blog.ghaiklor.com/optimizations-tricks-in-v8-d284b6c8b183

@jonnylink Masalah yang dibahas di sini tidak menyangkut parameter. Meskipun referensi yang Anda kutip menjelaskan definisi properti, itu juga tidak relevan dengan percakapan khusus ini. Mungkin Anda bermaksud memposting komentar Anda di tempat lain?

Pikiran tambahan saya sendiri:

  1. Pernyataan var x = undefined; melakukan _dua_ hal. Deklarasi variabel, seperti yang telah disebutkan semua orang, sebenarnya diangkat. Jika Anda melakukan ini secara manual, maka Anda dapat fokus pada poin berikutnya.
  2. jsHint tidak memiliki masalah dengan x = undefined; jadi mengangkat deklarasi secara manual juga akan menyelesaikan masalah.
  3. mendeklarasikan variabel dengan cepat dalam JavaScript mungkin merupakan ide yang buruk, dan mabuk dari C di mana itu tidak terlalu buruk. Di C, variabel memiliki ruang lingkup blok, jadi mendeklarasikan variabel sementara seperti yang telah Anda lakukan sangat berarti. Dalam JavaScript, variabel normal tidak memiliki cakupan blok, sehingga deklarasinya pada saat ini membingungkan, dan mungkin agak malas.
  4. JavaScript modern memiliki variabel let , yang cakupannya lebih mirip dengan variabel gaya C, dan mendeklarasikannya nanti ada benarnya.

Hanya berpikir keras…

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

strugee picture strugee  ·  8Komentar

stefanuddenberg picture stefanuddenberg  ·  7Komentar

nzakas picture nzakas  ·  10Komentar

ghost picture ghost  ·  5Komentar

MtDalPizzol picture MtDalPizzol  ·  7Komentar