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)
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
Saya menemukan semua sangat menarik. Tetapi mereka harus dipisahkan:
"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:
var
untuk setiap putaran loopvar
dicakupkan ke badan loop forTidak 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:
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.x = undefined;
jadi mengangkat deklarasi secara manual juga akan menyelesaikan masalah.let
, yang cakupannya lebih mirip dengan variabel gaya C, dan mendeklarasikannya nanti ada benarnya.Hanya berpikir keras…
Komentar yang paling membantu
:thumbsup: bukan kesalahan untuk menginisialisasi variabel ke
undefined