Apa cara yang benar untuk menulis for-in
loop di JavaScript? Browser tidak mengeluarkan keluhan tentang salah satu dari dua pendekatan yang saya tunjukkan di sini. Pertama, ada pendekatan ini di mana variabel iterasi x
dideklarasikan secara eksplisit:
for (var x in set) {
...
}
Dan sebagai alternatif, pendekatan ini yang terbaca lebih alami tetapi tampaknya tidak benar bagi saya:
for (x in set) {
...
}
javascript
syntax
for-in-loop
futlib
sumber
sumber
var
tidak digunakan untuk menyatakan iteratori
:Uncaught ReferenceError: i is not defined
. Jadi saya akan menggunakannya mulai sekarang: / webpack memperlakukan variabel "global" dengan aneh, untuk lebih lanjut lihat: stackoverflow.com/a/40416826Jawaban:
Gunakan
var
, ini mengurangi ruang lingkup variabel jika variabel mencari penutupan terdekat mencarivar
pernyataan. Jika tidak dapat menemukanvar
maka itu global (jika Anda dalam mode ketatusing strict
, variabel global membuat kesalahan). Hal ini dapat menyebabkan masalah seperti berikut ini.Jika Anda menulis
var i
di loop for, peringatan akan ditampilkan2
.Scoping dan Hoisting JavaScript
sumber
var
dalamfor
head tampak seperti lokal di loop for, padahal sebenarnya tidak. Karenanya, saya lebih suka gaya user422039 di bawah ini.Versi pertama:
mendeklarasikan variabel lokal yang dipanggil
x
. Versi kedua:tidak.
Jika
x
sudah menjadi variabel lokal (yaitu Anda memilikivar x;
atau divar x = ...;
suatu tempat sebelumnya dalam lingkup Anda saat ini (yaitu fungsi saat ini)) maka mereka akan setara. Jikax
belum menjadi variabel lokal, maka menggunakan yang kedua akan secara implisit mendeklarasikan variabel globalx
. Pertimbangkan kode ini:Anda mungkin berharap ini peringatan
hey
,there
,heli
,hey
,there
,copter
, tapi karenax
satu dan sama itu akan mengingatkanhey
,there
,there
,hey
,there
,there
. Anda tidak menginginkan itu! Gunakanvar x
difor
loop .Untuk melengkapi semua ini: jika
for
loop berada dalam cakupan global (yaitu bukan dalam fungsi), maka cakupan lokal (cakupanx
dideklarasikan jika Anda menggunakanvar x
) sama dengan cakupan global (cakupanx
secara implisit dideklarasikan dalam jika Anda menggunakanx
tanpa var), maka kedua versi tersebut akan sama.sumber
Anda benar-benar harus mendeklarasikan variabel lokal dengan
var
, always .Anda juga tidak boleh menggunakan pengulangan "untuk ... dalam" kecuali Anda benar-benar yakin bahwa itu yang ingin Anda lakukan. Untuk iterasi melalui array nyata (yang cukup umum), Anda harus selalu menggunakan loop dengan indeks numerik:
Iterasi melalui array biasa dengan "for ... in" dapat menimbulkan konsekuensi yang tidak terduga, karena loop Anda mungkin mengambil atribut array selain yang diindeks secara numerik.
edit - di sini pada tahun 2015 juga boleh digunakan
.forEach()
untuk mengulang melalui array:The
.forEach()
Metode hadir pada prototipe Array dari IE9 ke depan.sumber
Sebenarnya, jika Anda tidak menyukai deklarasi dalam
for
heading, Anda dapat melakukan:Seperti yang disebutkan dalam jawaban lain untuk pertanyaan ini, tidak menggunakan
var
sama sekali menghasilkan efek samping yang tidak perlu seperti menetapkan properti global.sumber
Gunakan salah satu tempat Anda mendeklarasikan variabel loop dengan
var
. Variabel yang dideklarasikan secara implisit memiliki cakupan berbeda yang mungkin bukan yang Anda inginkan.sumber
adalah pola yang umum terlihat tetapi berbeda dari
di C ++ karena variabel tidak dicakup ke
for
blok. Faktanya, yangvar
diangkat ke atas lingkup penutup (fungsi) sehingga lokali
akan tersedia secara efektif baik sebelumfor
loop (setelah awal ruang lingkup / fungsi saat ini) dan setelahnya.Dengan kata lain, melakukan:
sama dengan:
ES6 memiliki
let
kata kunci (bukanvar
) untuk membatasi cakupan ke blok for.Tentu saja, Anda HARUS menggunakan variabel lokal (yang dideklarasikan dengan
var
ataulet
atauconst
(dalam ES6)) daripada variabel global implisit.for(i=0; ...)
ataufor(i in ...)
akan gagal jika Anda menggunakan"use strict";
(sebagaimana mestinya) dani
tidak dideklarasikan.sumber
Menggunakan
var
adalah cara terbersih, tetapi keduanya bekerja seperti yang dijelaskan di sini: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...inPada dasarnya, dengan menggunakan
var
Anda memastikan bahwa Anda membuat variabel baru. Jika tidak, Anda mungkin tidak sengaja menggunakan variabel yang ditentukan sebelumnya.sumber
Saya pikir var bagus untuk alasan kinerja.
Javascript tidak akan melihat seluruh cakupan global untuk melihat apakah x sudah ada di tempat lain.
sumber
Dari sudut pandang umum, versi pertama adalah untuk indeks yang harus hidup dalam lingkup loop, sedangkan yang lain akan menjadi variabel dalam lingkup di mana konstruktor loop dipanggil.
Jika Anda akan menggunakan indeks loop di dalam for loop dan ini tidak akan diperlukan oleh orang lain di baris berikutnya, lebih baik deklarasikan variabel dengan "var" sehingga Anda akan yakin "x" untuk indeks loop yang diinisialisasi dengan 0, sedangkan yang lainnya, jika variabel "x" lain tersedia dalam konteks ini, ini akan ditimpa oleh indeks loop - Anda akan memiliki beberapa kesalahan logika -.
sumber