Panduan Babel untuk ES6 mengatakan:
let
adalah yang baruvar
.
Rupanya satu-satunya perbedaan adalah yang var
dicakup untuk fungsi saat ini , sementara let
dicakup untuk blok saat ini . Ada beberapa contoh bagus dalam jawaban ini .
Saya tidak dapat melihat alasan untuk menggunakan var
kode ES6. Bahkan jika Anda ingin membuat lingkup variabel tertentu ke seluruh fungsi, Anda bisa melakukannya dengan let
meletakkan deklarasi di bagian atas blok fungsi, yang adalah apa yang harus Anda lakukan dengan var
menunjukkan lingkup sebenarnya. Dan jika Anda ingin lingkup sesuatu yang lebih halus di for
blok atau sesuatu, maka Anda bisa melakukannya juga.
Jadi insting saya adalah berhenti menggunakan var
sama sekali saat menulis kode ES6.
Pertanyaan saya adalah, apakah saya salah tentang ini? Apakah ada kasus yang sah di mana var
lebih disukai daripada let
?
sumber
var
sebagai indikator sadar bahwa variabel ini dimaksudkan untuk mencakup seluruh fungsi mungkin menjadi konvensi "mendokumentasikan diri" yang berguna .let
pernyataan tepat di bagian atas fungsi, saya pikir itu sama jelasnya bahwa Anda bermaksud untuk lingkup itu ke seluruh fungsi. Saya tidak berpikir menggunakanvar
membuatnya lebih jelas daripada hanya menempatkannya di atas.var
masih ada, adalah kompatibilitas ke belakang. Jika bukan karena itu, mereka akan menghapusvar
semuanya, atau tidak pernah diperkenalkanlet
di tempat pertama, alih-alih mengubah semantik darivar
apa yang seharusnya sudah ada sejak lama.var
tampaknya tipis bagi saya, dan tidak cukup untuk menjamin memiliki jenis variabel ketiga yang melompat-lompat. Anda dapatlet
menetapkan cakupan ke seluruh fungsi hanya dengan menempatkannya di bagian atas fungsi, yang maksudnya jauh lebih jelas daripada menulisvar
di blok (untuk membuatnya diangkat keluar dari blok itu sehingga Anda dapat menggunakannya di luar blok) - aneh). Dia memperingatkan bahwa jika Andalet
menetapkan suatu fungsi maka "itu hanya posisi yang menandakan perbedaan, daripada sintaksis", tapi saya pikir itu hal yang baik.var
. contoh-contoh yang ia tampilkan untuk dijagavar
tampaknya dibuat-buat - dan didasarkan pada kesalahan pengkodean yang parah . Jauh lebih baik untuk mengalami kesalahan dan dipaksa untuk memperbaiki kesalahan seperti itu daripada menggunakan fungsi bahasa yang membuat orang bisa melakukannya! Apa selanjutnya, menyarankan untuk membungkus semuanya dalam mencoba / menangkap untuk mencegah crash? Sisa dari tautan itu bagus tapi saya tidak setuju sama sekali dengan bagian tertentu itu.Jawaban:
Doug Crockford membahas
let
pada titik ini dalam ceramahnya, " The Better Parts ".Intinya adalah,
let
menghindari sumber kesalahpahaman, khususnya. untuk programmer dengan harapan yang ditentukan oleh bahasa dengan blok-lingkup Avar
memiliki lingkup fungsi (ia menyatakan sebuah variabel yang terlihat di seluruh fungsi) meskipun sepertinya memiliki lingkup blok .var
mungkin masih berguna dalam kasus ekstrem seperti kode yang dihasilkan mesin, tapi saya berusaha keras di sana.(
const
juga baru dan memiliki ruang lingkup blok. Setelahlet x = {'hi': 'SE'}
Anda dapat menetapkan kembalix
, sedangkan setelahconst y = x
Anda tidak dapat menetapkan ulangy
. Itu sering lebih disukai karena itu membuat sesuatu dari sengaja berubah dari bawah Anda. Tetapi untuk menjadi jelas, Anda masih dapat memodifikasi objeky.hi = 'SO'
kecuali Anda bekukan.)Secara realistis, kesan Anda tepat untuk ES6: Adopsi
let
danconst
. Berhenti menggunakanvar
.(Dalam kinerja lain "The Better Parts" , Doug mengatakan mengapa
===
ditambahkan daripada memperbaiki masalah==
.==
Menghasilkan beberapa hasil yang "mengejutkan", jadi adopsi saja===
.)Contoh Pengungkapan
Jaringan Pengembang Mozilla memberikan contoh di mana
var
tidak berfungsi sebagaimana dimaksud. Contoh mereka adalah realistis yang menetapkanonclick
penangan di halaman web. Berikut ini adalah test case yang lebih kecil:var
gagal kami karena semua iterasi loop berbagii
variabel fungsi-lingkup yang sama , yang memiliki nilai5
setelah loop selesai.sumber
==
tidak rusak sama sekali. Ini hanya dapat didefinisikan sebagaiequality comparison using coersion
Periksa github.com/getify/Anda-Dont-Know-JS/blob/master/…[ '1.0' == 1.0, [1.0] == 1.0, [1.0] == '1.0', ['1.0'] == 1.0, [null] == '', [null] == 'null', '00' == false, [] == [], [] == 0, [] == '', [] == false, [] == true, [010] - [4] == ' 4.0 ', !![0], !![1], [0] == true, [1] == true, 1 == [[1]], 0 == [[0]], '1' == [1] ]
let
danvar
melainkan antaralet
,var
danconst
var
berfungsi seperti yang dirancang, tetapi tidak berapa banyak yang diharapkan orang. Ini adalah bug kegunaan, bukan bug implementasi.Jika Anda telah menulis kode yang benar, Anda mungkin dapat mengubah semua
var
pernyataan menjadilet
pernyataan tanpa perubahan semantik.let
lebih disukai karena mengurangi ruang lingkup di mana pengenal terlihat. Hal ini memungkinkan kita untuk mendeklarasikan variabel dengan aman di situs penggunaan pertama.const
lebih disukai daripadalet
. Kecuali Anda perlu bermutasi referensi, gunakanconst
deklarasi. Ini memiliki semua manfaatlet
seiring dengan mengurangi kehadiran variabel unitial dan membuat kode lebih mudah untuk dipikirkan. Jika Anda tidak yakin apakah Anda perlu bermutasi referensi, menyatakan ituconst
sampai Anda menemukan diri Anda secara eksplisit perlu melakukannya.sumber
Saya tidak selalu berpikir Anda salah, tetapi ada peringatan untuk menggunakan var. Pada dasarnya,
let
harus membantu pengembang mengatasi kebodohan JavaScript, terutama dengan konflik penamaan.var
, tampaknya, memiliki cakupan yang lebih besar karena ingin pergi ke lingkup fungsi penutup. Akan ada saat ketika Anda membutuhkan var, seperti ketika Anda membutuhkan variabel temp untuk tersedia dalam lingkup blok di dalam fungsi, jika tidak, lebih memilihlet
var akan membantu pengembang dengan konflik penamaan. Pada nada yang lebih ringan, sudah saatnya ES6 diperkenalkanlet
.sumber
var
di blok tersedia di dalam seluruh fungsi, bukan blok-scoped. Ini adalah fitur yang menyesatkan.Saya cenderung setuju bahwa hanya "biarkan" yang harus digunakan dalam es6. AFIK, mendeklarasikan ulang "let" menghasilkan kesalahan (yang bagus), sementara dengan "var", Anda cukup mengesampingkan nilainya (meskipun "mode ketat" di es5 juga mengurusnya).
sumber
let
berarti "biarkan variabel sama". Ini adalah deklarasi, dengan kata lain, inisialisasi dan penugasan.Itu ada berbeda dengan
const
yang tentu saja berarti "konstan" - yang merupakan kebalikan dari variabel.Beberapa bahasa lain menggunakan awalan ke objek aktual alih-alih objek saat mendeklarasikannya (mis.
def
Adalah singkatan untuk "define function" - benar-benar kehilangan titik dari apa yang sedang "def".Let
menambahkan inkonsistensi semantik ini ke Javascript.Secara logis, Anda dapat membiarkan konstanta sama dengan sesuatu juga, karena pekerjaan kata kunci "biarkan" adalah untuk menetapkan memori.
Masalah muncul karena
var
kata kunci yang diperkenalkan sebelumconst
didukung, jadi kompatibilitas mundur menentukan ituvar
tidak berarti variabel. (Ini juga dapat digunakan untuk menetapkan nilai konstan.)Oleh karena itu, pengenalan
let
di posisi yang salah. Untuk memastikan bahwa kita mengingat bahwa secara leksikal, ini salah, mereka juga memutuskan untuk mengubah ruang lingkup leksikallet
vsvar
, sehingga ketidakkonsistenan adalah yang terpenting dalam pikiran kita ketika melakukan debugging.Dengan kata lain,
let
ada karena orang (yang berarti pemelihara bahasa) berpikir bahwa Javascript terlalu konsisten, setelah menguasai semua idiom dan idiosinkrasi, menginginkan lebih banyak.Catatan,
var
tidak berfungsi di blok "panah" jika Anda ingin memperlakukan blok tersebut sebagai penutupan (karenavar
diperkenalkan sebelum memperlakukan blok sebagai penutupan), tetapi berfungsilet
.sumber
let
karena bertentangan dengan nada kata kunci lain dalam kategori yang sama dalam JavaScript. Tetap ini tidak menjawab pertanyaan, dan tidak terlalu baik. Downvotedlet
bukan hanya pengembang yang menginginkan lebih banyak kerumitan. Ini sebenarnya secara intuitif lebih dimengerti, karena ketika Anda loop-dan-over vars, penutupan mempertahankan nilai terakhir var, tetapi ketika Anda melakukan hal yang sama membiarkan, setiap penutupan dalam loop memiliki nilai sendiri untuk membiarkan, sebuah la contoh oleh @ Jerry101 di atas