ECMAScript 6 diperkenalkan pada let
pernyataan .
Saya pernah mendengar bahwa itu digambarkan sebagai variabel "lokal", tapi saya masih tidak yakin bagaimana ia berperilaku berbeda dari var
kata kunci.
Apa perbedaannya? Kapan sebaiknya let
digunakan var
?
let
termasuk dalam draft edisi ke - 6 dan kemungkinan besar akan berada dalam spesifikasi akhir.Jawaban:
Aturan pelingkupan
Perbedaan utama adalah aturan pelingkupan. Variabel yang dideklarasikan oleh
var
kata kunci dilingkupi ke badan fungsi langsung (maka lingkup fungsi) sementaralet
variabel dilingkupi ke blok penutup langsung yang dilambangkan dengan{ }
( oleh karenanya ruang lingkup blok).Alasan mengapa
let
kata kunci diperkenalkan ke bahasa adalah ruang lingkup fungsi membingungkan dan merupakan salah satu sumber utama bug dalam JavaScript.Lihatlah contoh ini dari pertanyaan stackoverflow lain :
My value: 3
adalah output ke konsol setiap kalifuncs[j]();
dipanggil karena fungsi anonim terikat ke variabel yang sama.Orang harus segera membuat fungsi yang dipanggil untuk mengambil nilai yang benar dari loop tetapi itu juga berbulu.
Mengangkat
Sementara variabel yang dideklarasikan dengan
var
kata kunci diangkat (diinisialisasi denganundefined
sebelum kode dijalankan) yang berarti mereka dapat diakses dalam lingkup terlampir mereka bahkan sebelum mereka dideklarasikan:let
variabel tidak diinisialisasi sampai definisi mereka dievaluasi. Mengaksesnya sebelum inisialisasi menghasilkan aReferenceError
. Variabel dikatakan berada di "zona mati temporal" dari awal blok sampai inisialisasi diproses.Membuat properti objek global
Di tingkat atas
let
, tidak sepertivar
, tidak membuat properti pada objek global:Deklarasi ulang
Dalam mode ketat,
var
Anda akan mendeklarasikan ulang variabel yang sama dalam cakupan yang sama sambillet
memunculkan SyntaxError.sumber
let
ekspresi bloklet (variable declaration) statement
tidak standar dan akan dihapus di masa depan, bugzilla.mozilla.org/show_bug.cgi?id=1023609 .let
juga dapat digunakan untuk menghindari masalah dengan penutupan. Itu mengikat nilai segar daripada menjaga referensi lama seperti yang ditunjukkan dalam contoh di bawah ini.Kode di atas menunjukkan masalah penutupan JavaScript klasik. Referensi ke
i
variabel disimpan dalam penutupan penangan klik, bukan nilai aktuali
.Setiap handler klik tunggal akan merujuk ke objek yang sama karena hanya ada satu objek penghitung yang menampung 6 sehingga Anda mendapatkan enam pada setiap klik.
Solusi umum adalah untuk membungkus ini dalam fungsi anonim dan lulus
i
sebagai argumen. Isu-isu tersebut juga dapat dihindari sekarang dengan menggunakanlet
bukannyavar
seperti yang ditunjukkan pada kode di bawah ini.(Diuji di Chrome dan Firefox 50)
sumber
let
, tetapi peringatan "6" untuk semua tombol. Apakah Anda memiliki sumber yang mengatakan bagaimanalet
seharusnya bersikap?let
akan sangat berguna. Mengatur pendengar peristiwa dalam satu lingkaran tidak lagi membutuhkan ekspresi fungsi yang segera dipanggil untuk pelingkupan lokali
di setiap iterasi.Apa perbedaan antara
let
danvar
?var
pernyataan dikenal di seluruh fungsi yang didefinisikan dalam, dari awal fungsi.(*)let
pernyataan hanya diketahui dalam blok yang didefinisikan, sejak saat didefinisikan selanjutnya. (**)Untuk memahami perbedaannya, pertimbangkan kode berikut:
Di sini, kita dapat melihat bahwa variabel kita
j
hanya dikenal di awal untuk loop, tetapi tidak sebelum dan sesudah. Namun, variabel kamii
dikenal di seluruh fungsi.Juga, pertimbangkan bahwa variabel blok ruang tidak diketahui sebelum mereka dinyatakan karena mereka tidak diangkat. Anda juga tidak diizinkan untuk mendeklarasikan ulang variabel scoping blok yang sama dalam blok yang sama. Hal ini membuat variabel yang dicakup blok lebih rentan kesalahan daripada variabel yang dicakup secara global atau fungsional, yang diangkat dan yang tidak menghasilkan kesalahan apa pun jika terjadi beberapa deklarasi.
Apakah aman digunakan
let
hari ini?Beberapa orang akan berpendapat bahwa di masa depan kita HANYA akan menggunakan pernyataan let dan pernyataan var akan menjadi usang. Guru JavaScript Kyle Simpson menulis artikel yang sangat rumit tentang mengapa ia percaya itu tidak akan terjadi .
Namun, hari ini jelas bukan itu masalahnya. Sebenarnya, kita perlu bertanya pada diri sendiri apakah aman menggunakan
let
pernyataan itu. Jawaban untuk pertanyaan itu tergantung pada lingkungan Anda:Jika Anda menulis kode JavaScript sisi-server ( Node.js ), Anda dapat menggunakan
let
pernyataan dengan aman .Jika Anda menulis kode JavaScript sisi klien dan menggunakan transpiler berbasis browser (seperti Traceur atau babel-standalone ), Anda dapat menggunakan
let
pernyataan itu dengan aman , namun kode Anda kemungkinan tidak optimal sehubungan dengan kinerja.Jika Anda menulis kode JavaScript sisi klien dan menggunakan transpiler berbasis Node (seperti skrip traceur shell atau Babel ), Anda dapat menggunakan
let
pernyataan dengan aman . Dan karena browser Anda hanya akan tahu tentang kode yang diubahnya, kelemahan kinerja harus dibatasi.Jika Anda menulis kode JavaScript sisi klien dan tidak menggunakan transpiler, Anda perlu mempertimbangkan dukungan browser.
Masih ada beberapa browser yang tidak mendukung
let
sama sekali:Bagaimana cara melacak dukungan browser
Untuk gambaran umum terkini tentang browser yang mendukung
let
pernyataan pada saat Anda membaca jawaban ini, lihat halaman iniCan I Use
.(*) Variabel cakupan global dan fungsional dapat diinisialisasi dan digunakan sebelum mereka dinyatakan karena variabel JavaScript diangkat .Ini berarti bahwa deklarasi selalu jauh di atas cakupan.
(**) Variabel yang dicakup blok tidak diangkat
sumber
i
Diketahui di mana-mana di blok fungsi! Dimulai sebagaiundefined
(karena mengangkat) hingga Anda menetapkan nilai! ps:let
juga diangkat (ke bagian atas blok yang berisi), tetapi akan memberikanReferenceError
ketika direferensikan di blok sebelum tugas pertama. (ps2: Saya agak pro-titik koma tapi Anda benar-benar tidak memerlukan titik koma setelah satu blok). Yang sedang berkata, terima kasih telah menambahkan kenyataan-periksa tentang dukungan!let
danvar
!let
danconst
yang direkomendasikan hanya digunakan ketika Anda benar-benar membutuhkan fungsi tambahan mereka , karena menegakkan / memeriksa fitur tambahan (seperti write-satunya const) hasil di 'kerja yang lebih '(dan node-lingkup tambahan di pohon-lingkup) untuk mesin (saat ini) untuk menegakkan / memeriksa / memverifikasi / pengaturan.Berikut penjelasan
let
kata kunci dengan beberapa contoh.Meja ini di Wikipedia menunjukkan browser mana yang mendukung Javascript 1.7.
Perhatikan bahwa hanya browser Mozilla dan Chrome yang mendukungnya. IE, Safari, dan yang lainnya tidak.
sumber
let
msdn.microsoft.com/en-us/library/ie/dn342892%28v=vs.85%29.aspxJawaban yang diterima tidak ada benarnya:
sumber
for
penginisialisasi loop, secara dramatis mempersempit ruang lingkup penerapan pembatasanlet
. Terpilih.let
Lingkup blok
Variabel yang dideklarasikan menggunakan
let
kata kunci adalah blok-lingkup, yang berarti bahwa mereka hanya tersedia di blok di mana mereka dinyatakan.Di tingkat atas (di luar fungsi)
Di tingkat atas, variabel yang dideklarasikan menggunakan
let
tidak membuat properti pada objek global.Di dalam suatu fungsi
Di dalam fungsi (tetapi di luar blok),
let
memiliki cakupan yang sama denganvar
.Di dalam blok
Variabel yang dinyatakan menggunakan
let
di dalam blok tidak dapat diakses di luar blok itu.Di dalam lingkaran
Variabel yang dideklarasikan dengan
let
in loop hanya dapat dirujuk di dalam loop itu.Loop dengan penutupan
Jika Anda menggunakan
let
alih-alihvar
dalam satu lingkaran, dengan setiap iterasi Anda mendapatkan variabel baru. Itu berarti bahwa Anda dapat menggunakan penutupan di dalam lingkaran dengan aman.Zona mati temporal
Karena zona mati temporal , variabel yang dideklarasikan menggunakan
let
tidak dapat diakses sebelum dideklarasikan. Mencoba melakukannya akan menimbulkan kesalahan.Tidak mendeklarasikan ulang
Anda tidak dapat mendeklarasikan variabel yang sama beberapa kali menggunakan
let
. Anda juga tidak bisa mendeklarasikan variabel menggunakanlet
dengan pengidentifikasi yang sama dengan variabel lain yang dideklarasikan menggunakanvar
.const
const
sangat mirip denganlet
—batas-blok dan memiliki TDZ. Namun, ada dua hal yang berbeda.Tidak ada penetapan ulang
Variabel yang dinyatakan menggunakan
const
tidak dapat ditugaskan kembali.Perhatikan bahwa itu tidak berarti bahwa nilainya tidak berubah. Sifat-sifatnya masih bisa diubah.
Jika Anda ingin memiliki objek yang tidak dapat diubah, Anda harus menggunakannya
Object.freeze()
.Diperlukan inisialisasi
Anda selalu harus menentukan nilai saat mendeklarasikan variabel menggunakan
const
.sumber
Berikut adalah contoh untuk perbedaan antara keduanya (dukungan baru saja dimulai untuk chrome):
Seperti yang Anda lihat,
var j
variabel masih memiliki nilai di luar lingkup loop (Blok Lingkup), tetapilet i
variabel tidak ditentukan di luar lingkup loop.sumber
Ada beberapa perbedaan halus -
let
pelingkupan berperilaku lebih seperti pelingkupan variabel dalam kurang lebih bahasa lainnya.mis. Ini lingkup ke blok terlampir, Mereka tidak ada sebelum mereka dinyatakan, dll.
Namun perlu dicatat bahwa
let
ini hanya bagian dari implementasi Javascript yang lebih baru dan memiliki berbagai tingkat dukungan browser .sumber
let
termasuk dalam draft edisi ke - 6 dan kemungkinan besar akan berada dalam spesifikasi akhir.let
. Safari, IE, dan Chome semuanya tidak.let
tidak mengangkat, untuk menggunakan variabel yang didefinisikan oleh yanglet
didefinisikan di bagian atas blok Anda. Jika Anda memilikiif
pernyataan yang lebih dari beberapa baris kode, Anda mungkin lupa bahwa Anda tidak dapat menggunakan variabel itu sampai setelah itu ditentukan. TITIK BESAR !!!let
akan mengangkat variabel ke atas blok. Namun, merujuk variabel di blok sebelum hasil deklarasi variabel dalam ReferenceError (catatan saya: bukan yang lama yang baikundefined
). The variabel berada dalam 'zona mati temporal' dari awal blok hingga deklarasi diproses. " Hal yang sama berlaku untuk "beralih pernyataan karena hanya ada satu blok yang mendasarinya". Sumber: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Perbedaan utama adalah perbedaan ruang lingkup , sementara mari bisa hanya tersedia di dalam lingkup yang dideklarasikan, seperti di untuk loop, var dapat diakses di luar loop misalnya. Dari dokumentasi di MDN (contoh juga dari MDN):
Juga jangan lupa itu fitur ECMA6, jadi belum sepenuhnya didukung, jadi lebih baik selalu mentransmisikannya ke ECMA5 menggunakan Babel dll ... untuk info lebih lanjut tentang kunjungi situs web babel
sumber
Variabel Tidak Mengangkatlet
tidak akan mengerek ke seluruh ruang lingkup blok tempat mereka muncul. Sebaliknya,var
bisa mengerek seperti di bawah ini.Sebenarnya, Per @Bergi, Keduanya
var
danlet
sedang diangkat .Pengumpulan Sampah
Ruang lingkup blok
let
berguna berkaitan dengan penutupan dan pengumpulan sampah untuk merebut kembali memori. Mempertimbangkan,The
click
handler callback tidak perluhugeData
variabel sama sekali. Secara teoritis, setelahprocess(..)
dijalankan, struktur data yang sangat besarhugeData
bisa berupa sampah yang dikumpulkan. Namun, ada kemungkinan bahwa beberapa mesin JS masih harus mempertahankan struktur besar ini, karenaclick
fungsinya memiliki penutupan atas seluruh ruang lingkup.Namun, ruang lingkup blok dapat membuat struktur data yang sangat besar ini menjadi sampah yang dikumpulkan.
let
looplet
dalam loop dapat mengikat kembali ke setiap iterasi dari loop, pastikan untuk menetapkan kembali nilai dari akhir iterasi loop sebelumnya. Mempertimbangkan,Namun, ganti
var
denganlet
Karena
let
membuat lingkungan leksikal baru dengan nama-nama untuk a) ekspresi penginisialisasi b) setiap iterasi (sebelumnya untuk mengevaluasi ekspresi kenaikan), rincian lebih lanjut ada di sini .sumber
Berikut adalah contoh untuk menambahkan apa yang sudah ditulis orang lain. Misalkan Anda ingin membuat array fungsi,, di
adderFunctions
mana setiap fungsi mengambil argumen Number tunggal dan mengembalikan jumlah argumen dan indeks fungsi dalam array. Mencoba menghasilkanadderFunctions
dengan loop menggunakanvar
kata kunci tidak akan bekerja seperti yang diharapkan orang dengan naif:Proses di atas tidak menghasilkan array fungsi yang diinginkan karena
i
ruang lingkup melampaui iterasi darifor
blok di mana setiap fungsi dibuat. Sebagai gantinya, pada akhir loop,i
penutupan di setiap fungsi mengacu padai
nilai di akhir loop (1000) untuk setiap fungsi anonim diadderFunctions
. Ini sama sekali bukan yang kita inginkan: kita sekarang memiliki array 1000 fungsi berbeda dalam memori dengan perilaku yang persis sama. Dan jika kami selanjutnya memperbarui nilaii
, mutasi akan mempengaruhi semuaadderFunctions
.Namun, kami dapat mencoba lagi menggunakan
let
kata kunci:Kali ini,
i
rebound pada setiap iterasifor
loop. Setiap fungsi sekarang menyimpan nilaii
pada saat penciptaan fungsi, danadderFunctions
berperilaku seperti yang diharapkan.Sekarang, pencampuran gambar dua perilaku dan Anda mungkin akan melihat mengapa tidak disarankan untuk menggabungkan yang lebih baru
let
danconst
yang lebih lamavar
dalam skrip yang sama. Melakukannya dapat menghasilkan kode yang membingungkan.Jangan biarkan ini terjadi pada Anda. Gunakan linter.
sumber
let value = i;
. Thefor
pernyataan menciptakan blok leksikal.Perbedaannya terletak pada ruang lingkupnya variabel yang dideklarasikan dengan masing-masing.
Dalam praktiknya, ada sejumlah konsekuensi berguna dari perbedaan ruang lingkup:
let
variabel hanya terlihat di blok terlampir terdekat ({ ... }
).let
variabel hanya dapat digunakan dalam baris kode yang terjadi setelah variabel dideklarasikan (meskipun mereka dinaikkan !).let
variabel tidak boleh dideklarasikan ulang oleh variabel berikutnyavar
ataulet
.let
Variabel global tidak ditambahkan kewindow
objek global .let
variabel mudah digunakan dengan penutupan (mereka tidak menyebabkan kondisi balapan ).Pembatasan yang diberlakukan dengan
let
mengurangi visibilitas variabel dan meningkatkan kemungkinan tabrakan nama yang tidak terduga akan ditemukan lebih awal. Ini membuatnya lebih mudah untuk dilacak dan alasan tentang variabel, termasuk jangkauannya (membantu memulihkan kembali memori yang tidak digunakan).Akibatnya,
let
variabel cenderung menyebabkan masalah ketika digunakan dalam program besar atau ketika kerangka kerja yang dikembangkan secara independen dikombinasikan dengan cara-cara baru dan tidak terduga.var
mungkin masih berguna jika Anda yakin Anda ingin efek ikatan tunggal saat menggunakan penutupan dalam satu lingkaran (# 5) atau untuk mendeklarasikan variabel global yang terlihat secara eksternal dalam kode Anda (# 4). Penggunaanvar
untuk ekspor dapat digantikan jikaexport
bermigrasi keluar dari ruang transpiler dan ke dalam bahasa inti.Contohnya
1. Tidak digunakan di luar blok penutup terdekat: Blok kode ini akan melempar kesalahan referensi karena penggunaan kedua
x
terjadi di luar blok di mana dinyatakan denganlet
:Sebaliknya, contoh yang sama dengan
var
karya.2. Tidak ada gunanya sebelum deklarasi:
Blok kode ini akan melempar
ReferenceError
sebelum kode dapat dijalankan karenax
digunakan sebelum dideklarasikan:Sebaliknya, contoh yang sama dengan
var
mem - parsing dan menjalankan tanpa melemparkan pengecualian.3. Tidak ada deklarasi ulang: Kode berikut menunjukkan bahwa variabel yang dideklarasikan dengan
let
mungkin tidak akan dideklar ulang nanti:4. Global tidak melekat pada
window
:5. Mudah digunakan dengan penutupan: Variabel dideklarasikan dengan
var
tidak bekerja dengan baik dengan penutupan di dalam loop. Berikut ini adalah loop sederhana yang menampilkan urutan nilai yang dimiliki variabeli
pada titik waktu yang berbeda:Secara khusus, output ini:
Dalam JavaScript kita sering menggunakan variabel pada waktu yang lebih lama daripada saat mereka dibuat. Ketika kami menunjukkan ini dengan menunda output dengan penutupan diteruskan ke
setTimeout
:... output tetap tidak berubah selama kita tetap dengan
let
. Sebaliknya, jika kita menggunakanvar i
sebagai gantinya:... loop secara tak terduga menampilkan "i is 5" lima kali:
sumber
var
alih-alihlet
, kode ini setara dengan: divar i = 0; while (i < 5) { doSomethingLater(); i++; }
i
luar penutupan, dan pada saatdoSomethingLater()
dieksekusi,i
telah meningkat 5 kali, maka outputnyai is 5
lima kali. Dengan menggunakanlet
, variabeli
berada dalam penutupan, sehingga setiap panggilan async mendapatkan salinannya sendirii
daripada menggunakan 'global' yang dibuat denganvar
.for
. Transformasi yang lebih akurat, meskipun lebih rumit, adalah klasikfor (var i = 0; i < 5; i++) { (function(j) { setTimeout(_ => console.log(
i adalah $ {j}), 125/*ms*/); })(i); }
yang memperkenalkan "catatan fungsi-aktivasi" untuk menyimpan setiap nilaii
dengan namaj
di dalam fungsi.Semoga dua fungsi berikut menunjukkan perbedaan:
sumber
let
menarik, karena memungkinkan kita untuk melakukan sesuatu seperti ini:Yang menghasilkan penghitungan [0, 7].
Sedangkan
Hanya dihitung [0, 1].
sumber
Fungsi VS blok ruang lingkup:
Perbedaan utama antara
var
danlet
adalah bahwa variabel yang dideklarasikan denganvar
adalah scoped fungsi . Sedangkan fungsi yang dideklarasikan denganlet
adalah blok scoped . Sebagai contoh:variabel dengan
var
:Ketika fungsi pertama
testVar
dipanggil variabel foo, dideklarasikan denganvar
, masih dapat diakses di luarif
pernyataan. Variabel inifoo
akan tersedia di mana - mana dalam lingkuptestVar
fungsi .variabel dengan
let
:Ketika fungsi kedua
testLet
dipanggil sebagai bilah variabel, dideklarasikan denganlet
, hanya dapat diakses di dalamif
pernyataan. Karena variabel yang dideklarasikan denganlet
yang blok scoped (di mana blok adalah kode antara kurung keriting misalnyaif{}
,for{}
,function{}
).let
variabel tidak diangkat:Perbedaan lain antara
var
danlet
adalah variabel-variabel dengan yang dideklarasikan denganlet
tidak mendapatkan dukungan . Contoh adalah cara terbaik untuk menggambarkan perilaku ini:variabel dengan
let
jangan diangkat:variabel dengan
var
do hoisted:Global
let
tidak terikat padawindow
:Variabel dideklarasikan dengan
let
dalam lingkup global (yang merupakan kode yang tidak ada dalam suatu fungsi) tidak ditambahkan sebagai properti padawindow
objek global . Misalnya (kode ini dalam lingkup global):Gunakan
let
lebih darivar
kapan pun Anda bisa karena itu hanya mencakup lebih spesifik. Ini mengurangi potensi konflik penamaan yang dapat terjadi ketika berhadapan dengan sejumlah besar variabel.var
dapat digunakan ketika Anda ingin variabel global secara eksplisit berada diwindow
objek (selalu pertimbangkan dengan hati-hati jika ini benar-benar diperlukan).sumber
Tampaknya juga, setidaknya dalam Visual Studio 2015, TypeScript 1.5, "var" memungkinkan beberapa deklarasi dari nama variabel yang sama dalam sebuah blok, dan "let" tidak.
Ini tidak akan menghasilkan kesalahan kompilasi:
Ini akan:
sumber
var
adalah variabel lingkup global (mampu-hoist).let
danconst
ruang lingkup blok.sumber
Ketika menggunakan
let
Kata
let
kunci melampirkan deklarasi variabel ke ruang lingkup blok apa pun (umumnya{ .. }
pasangan) yang terkandung di dalamnya. Dengan kata lain,let
secara implisit membajak ruang lingkup blok apa pun untuk deklarasi variabelnya.let
variabel tidak dapat diakses diwindow
objek karena mereka tidak dapat diakses secara global.Ketika menggunakan
var
var
dan variabel dalam ES5 memiliki cakupan fungsi yang berarti variabel tersebut valid di dalam fungsi dan tidak di luar fungsi itu sendiri.var
variabel dapat diakses diwindow
objek karena mereka tidak dapat diakses secara global.Jika Anda ingin tahu lebih lanjut, baca terus di bawah ini
salah satu pertanyaan wawancara paling terkenal tentang ruang lingkup juga dapat mencukupi penggunaan tepat
let
danvar
seperti di bawah ini;Ketika menggunakan
let
Ini karena ketika menggunakan
let
, untuk setiap iterasi loop variabel dicakup dan memiliki salinannya sendiri.Ketika menggunakan
var
Ini karena ketika menggunakan
var
, untuk setiap iterasi loop variabel dicakup dan telah berbagi salinan.sumber
Dalam kebanyakan istilah dasar,
⚡️ Sandbox untuk bermain-main ↓
sumber
Jika saya membaca spesifikasi dengan benar maka
let
untungnya juga dapat dimanfaatkan untuk menghindari fungsi yang digunakan sendiri untuk mensimulasikan anggota pribadi saja - pola desain populer yang mengurangi pembacaan kode, menyulitkan debugging, yang tidak menambahkan perlindungan kode nyata atau manfaat lainnya - kecuali mungkin memuaskan seseorang keinginan untuk semantik, jadi berhentilah menggunakannya. / kata-kata kasarLihat ' Mengemulasi antarmuka pribadi '
sumber
let
tidak? (Saya anggap Anda maksud IIFE dengan "fungsi memohon sendiri".)hiddenProperty
konstruktor? Hanya ada satuhiddenProperty
untuk semua instance di "kelas" Anda.Beberapa peretasan dengan
let
:1.
2.
3.
Getter dan setter dengan
let
:sumber
let { type, name, value } = node;
? Anda membuat objek baru dengan 3 tipe properti / nama / nilai dan menginisialisasinya dengan nilai properti dari node?var
.biarkan vs var. Ini semua tentang ruang lingkup .
variabel var bersifat global dan pada dasarnya dapat diakses di mana-mana, sementara variabel tidak bersifat global dan hanya ada sampai tanda kurung tutup membunuhnya.
Lihat contoh saya di bawah ini, dan perhatikan bagaimana variabel singa (biarkan) bertindak berbeda di dua console.logs; itu menjadi di luar ruang lingkup di console.log 2.
sumber
sumber
biarkan adalah bagian dari es6. Fungsi-fungsi ini akan menjelaskan perbedaannya dengan cara yang mudah.
sumber
Di bawah ini menunjukkan perbedaan 'let' dan 'var' dalam cakupan:
The
gfoo
, yang didefinisikan olehlet
awalnya adalah di lingkup global , dan ketika kita mendeklarasikangfoo
lagi di dalamif clause
nya lingkup berubah dan ketika nilai baru ditugaskan untuk variabel dalam lingkup yang tidak mempengaruhi lingkup global.Sedangkan
hfoo
, yang didefinisikan olehvar
awalnya dalam lingkup global , tetapi sekali lagi ketika kami mendeklarasikannya di dalamif clause
, itu menganggap lingkup global hfoo, meskipun var telah digunakan lagi untuk mendeklarasikannya. Dan ketika kita menetapkan ulang nilainya, kita melihat bahwa ruang lingkup global hfoo juga terpengaruh. Inilah perbedaan utama.sumber
Seperti disebutkan di atas:
Contoh 1:
Dalam kedua contoh saya, saya memiliki fungsi
myfunc
.myfunc
berisi variabelmyvar
sama dengan 10. Dalam contoh pertama saya, saya memeriksa apakahmyvar
sama dengan 10 (myvar==10
). Jika ya, saya agian mendeklarasikan variabelmyvar
(sekarang saya memiliki dua variabel myvar) menggunakanvar
kata kunci dan menetapkannya nilai baru (20). Pada baris berikutnya saya mencetak nilainya di konsol saya. Setelah blok bersyarat saya kembali mencetak nilaimyvar
pada konsol saya. Jika Anda melihat output darimyfunc
,myvar
memiliki nilai sama dengan 20.Contoh2: Dalam contoh kedua saya alih-alih menggunakan
var
kata kunci di blok bersyarat saya menyatakanmyvar
menggunakanlet
kata kunci. Sekarang ketika saya meneleponmyfunc
saya mendapatkan dua output yang berbeda:myvar=20
danmyvar=10
.Jadi perbedaannya sangat sederhana yaitu cakupannya.
sumber
Saya ingin menautkan kata kunci ini ke Konteks Eksekusi, karena Konteks Eksekusi penting dalam semua ini. Konteks Eksekusi memiliki dua fase: Fase Penciptaan dan Fase Eksekusi. Selain itu, setiap Konteks Eksekusi memiliki Lingkungan Variabel dan Lingkungan Luar (Lingkungan Leksikalalnya).
Selama Fase Pembuatan Konteks Eksekusi, var, let dan const masih akan menyimpan variabelnya dalam memori dengan nilai yang tidak ditentukan dalam Lingkungan Variabel dari Konteks Eksekusi yang diberikan. Perbedaannya ada pada Tahap Eksekusi. Jika Anda menggunakan referensi variabel yang didefinisikan dengan var sebelum diberi nilai, itu hanya akan tidak ditentukan. Tidak ada pengecualian akan dimunculkan.
Namun, Anda tidak dapat mereferensi variabel yang dideklarasikan dengan let atau const hingga dinyatakan. Jika Anda mencoba menggunakannya sebelum diumumkan, maka pengecualian akan dimunculkan selama Fase Eksekusi dari Konteks Eksekusi. Sekarang variabel masih akan berada dalam memori, milik Fase Penciptaan Konteks Eksekusi, tetapi Mesin tidak akan memungkinkan Anda untuk menggunakannya:
Dengan variabel yang didefinisikan dengan var, jika Mesin tidak dapat menemukan variabel dalam Lingkungan Variabel Konteks Eksekusi saat ini, maka itu akan naik rantai lingkup (Lingkungan Luar) dan memeriksa Lingkungan Variabel Lingkungan Luar untuk variabel. Jika tidak dapat menemukannya di sana, ia akan terus mencari Rantai Lingkup. Ini tidak terjadi dengan let dan const.
Fitur kedua let adalah ia memperkenalkan ruang lingkup blok. Blok didefinisikan oleh kurung kurawal. Contohnya termasuk blok fungsi, jika blok, untuk blok, dll. Ketika Anda mendeklarasikan variabel dengan membiarkan bagian dalam blok, variabel hanya tersedia di dalam blok. Bahkan, setiap kali blok dijalankan, seperti di dalam for loop, itu akan membuat variabel baru di memori.
ES6 juga memperkenalkan kata kunci const untuk mendeklarasikan variabel. const juga blok scoped. Perbedaan antara let dan const adalah bahwa variabel const perlu dideklarasikan menggunakan penginisialisasi, atau itu akan menghasilkan kesalahan.
Dan, akhirnya, ketika sampai pada Konteks Eksekusi, variabel yang didefinisikan dengan var akan dilampirkan ke objek 'ini'. Dalam Konteks Eksekusi global, itu akan menjadi objek jendela di browser. Ini bukan kasus untuk let atau const.
sumber
Saya pikir istilah dan sebagian besar contohnya agak luar biasa, Masalah utama yang saya miliki secara pribadi dengan perbedaannya adalah memahami apa itu "Block". Pada titik yang saya sadari, sebuah blok akan berupa kurung keriting kecuali
IF
pernyataan. braket pembuka{
dari suatu fungsi atau loop akan menentukan blok baru, apa pun yang didefinisikanlet
di dalamnya, tidak akan tersedia setelah braket penutup}
dari hal yang sama (fungsi atau loop); Dengan mengingat hal itu, lebih mudah untuk dipahami:sumber
Sekarang saya pikir ada pelingkupan variabel yang lebih baik ke blok pernyataan menggunakan
let
:Saya pikir orang akan mulai menggunakan biarkan di sini setelah sehingga mereka akan memiliki ruang lingkup yang sama dalam JavaScript seperti bahasa lain, Java, C #, dll.
Orang-orang yang tidak memiliki pemahaman yang jelas tentang pelingkupan dalam JavaScript digunakan untuk melakukan kesalahan sebelumnya.
Mengangkat tidak didukung menggunakan
let
.Dengan pendekatan ini kesalahan yang ada dalam JavaScript semakin dihapus.
Lihat ES6 Dalam Kedalaman: biarkan dan const untuk memahaminya dengan lebih baik.
sumber
Artikel ini dengan jelas mendefinisikan perbedaan antara var, let dan const
https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#.esmkpbg9b
sumber