Mengapa nama 'mari' dipilih untuk deklarasi variabel blok-ruang dalam JavaScript?


306

Saya mengerti mengapa varmengambil nama itu - itu variabel, const- itu adalah konstan, tetapi apa artinya di belakang nama itu let, yang lingkupnya ke blok saat ini? Biarlah?


7
BASIC , ditemukan pada tahun 1962, digunakan LET. Mungkin ada contoh bahasa sebelumnya.
David R Tribble

5
BASIC diciptakan pada tahun 1964 , bukan 1962. Lihat juga di sini . Penggunaan LETdijelaskan pada halaman 7 dari draft pertama manual, tertanggal Mei 1964, pdf di sini .
Joseph Quinsey

Lebih khusus lagi constadalah referensi objek yang konstan, atau tidak berubah (hanya-baca) di mana objek itu sendiri masih bisa berubah. Misalnya. Setelah deklarasi / penugasan const foo = ['bar'], foo.push('bat')masih akan sah, tetapi foo = ['bar', 'bat']tidak. Tapi itu terlalu banyak mengetik.
user982671

Jawaban:


372

Biarkan adalah pernyataan matematis yang diadopsi oleh bahasa pemrograman awal seperti Skema dan Dasar. Variabel dianggap entitas tingkat rendah yang tidak cocok untuk tingkat abstraksi yang lebih tinggi, sehingga keinginan banyak perancang bahasa untuk memperkenalkan konsep serupa tetapi lebih kuat seperti di Clojure, F #, Scala, di mana letmungkin berarti nilai, atau variabel yang dapat ditugaskan, tetapi tidak diubah , yang pada gilirannya memungkinkan kompiler menangkap lebih banyak kesalahan pemrograman dan mengoptimalkan kode lebih baik.

JavaScript sudah ada varsejak awal, jadi mereka hanya perlu kata kunci lain, dan baru saja meminjam dari puluhan bahasa lain yang letsudah menggunakan kata kunci tradisional sedekat varmungkin, meskipun dalam JavaScript letmalah menciptakan ruang lingkup variabel lokal sebagai gantinya.


94
Dan halaman resmi Mozilla Documentation mengutip halaman ini untuk pertanyaan ini developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Sarath Chandra

9
Itu juga bagus len('var') === len('let'), artinya deklarasi Anda berbaris dengan baik di editor Anda. Saya belum menemukan apa pun untuk menyarankan ini disengaja, tetapi dapat berupa a) menyenangkan secara visual dan lebih mudah dibaca, atau b) sangat menyebalkan untuk men-debug jika Anda mencampur keduanya (yang sepertinya merupakan ide yang buruk, tapi saya ' telah melihatnya selesai).
brichins

13
Dengan kata lain, lettelah secara tradisional digunakan untuk menggambarkan suatu konstanta, seperti dalam let C = the speed of lightJavascript memutuskan untuk menggunakan biarkan untuk menggambarkan variabel dengan pelingkupan tidak standar dan pada saat yang sama memperkenalkan kata kunci lain untuk konstanta.
fijiaaron

1
Saya tidak setuju itu letdekat var. Scala juga tidak digunakan letjadi saya tidak melihat bagaimana itu relevan.
Aluan Haddad

3
@fijiaaron: Pelingkupan tidak standar, bagaimana? Bukankah seluruh fungsi-terlepas-dari-apa-blok-Anda-dinyatakan-itu-dalam jenis aneh untuk memulai?
SamB

78

Saya kira ini mengikuti tradisi matematika. Dalam matematika, sering dikatakan "biarkan x menjadi bilangan real arbitrer" atau seperti itu.


Saya lebih suka jawaban ini karena singkat dan cukup cocok karena kita semua mempelajari aljabar, maka mungkin harus diikuti dengan penjelasan seperti apa yang ditunjukkan orang lain.
duduwe

69

Menambah respons exebook , penggunaan matematika dari kata kunci memungkinkan juga merangkum implikasi pelingkupan letketika digunakan dalam Javascript / ES6. Secara khusus, sama seperti kode ES6 berikut ini tidak mengetahui penugasan dalam kurung kurawal toPrint ketika mencetak nilai 'Hello World',

let toPrint = 'Hello World.';
{
    let toPrint = 'Goodbye World.';
}
console.log(toPrint); // Prints 'Hello World'

membiarkan seperti yang digunakan dalam matematika formal (terutama penulisan bukti) menunjukkan bahwa turunan variabel saat ini hanya ada untuk lingkup gagasan logis itu. Dalam contoh berikut, x segera memperoleh identitas baru setelah memasukkan ide baru (biasanya ini adalah konsep yang diperlukan untuk membuktikan ide utama) dan segera kembali ke yang lama pada kesimpulan sub-bukti. Tentu saja, seperti dalam pengkodean, ini dianggap agak membingungkan dan biasanya dihindari dengan memilih nama yang berbeda untuk variabel lain.

Biarkan x begitu dan begitu ...

  Barang bukti

 Ide Baru {Biarkan x menjadi sesuatu yang lain ... buktikan sesuatu} Akhiri Ide Baru

 Buktikan ide utama dengan x lama


19
Saya pikir ini sangat berguna. Jawaban yang diterima hampir agak menyesatkan, karena berbicara tentang nilai yang tidak dapat diubah, yang sama sekali bukan lettentang apa. letadalah semua tentang ruang lingkup.
jinglesthula

Hanya sebuah pemikiran: letmembuat saya memikirkan hal seperti ini terjadi dalam pikiran penulis kode, "Ok, untuk saat ini saja let foo = bar, tetapi kemudian dapat kembali ke nilai aslinya atau berhenti. Ini diilustrasikan dengan rapi dalam contoh untuk Block Scope dan Redeclaring Variables dalam presentasi W3Schools ini dari let. Sekali lagi, tidak berpura-pura membawa semacam jawaban ilmiah, tetapi membagikan ini lebih sebagai perangkat mnemonik untuk diingat ketika saya ingin menggunakanlet .
Alain

Saya pikir ada baiknya sedikit lebih tepat di sini, demi kejelasan konseptual. Contoh kode ES6 Anda tidak "mengabaikan tugas dalam kurung". Itu melakukan tugas seperti yang diperintahkan, pada variabel barutoPrint yang hanya ada di dalam blok , dan kemudian dengan patuh membuang variabel itu ketika blok berakhir. Dan saat keluar, kita kembali ke ruang lingkup luar, di mana bagian dalam toPrinttidak ada lagi, jadi console.log(toPrint)mengacu pada bagian luar toPrint . Bukannya sesuatu diabaikan, hanya saja letvariabel memiliki masa hidup terbatas yang ditentukan oleh cakupannya.
FeRD

1
@FeRD, poin bagus. Saya telah mengedit di atas untuk menghapus penggunaan kata "abaikan" karena mengaburkan intinya.
Evan White

36

Itu tidak persis apa yang vardilakukannya dengan perbedaan ruang lingkup. Sekarang tidak dapat mengambil nama varkarena sudah diambil.

Jadi sepertinya telah mengambil nama terbaik berikutnya yang memiliki semantik dalam konstruksi bahasa Inggris yang menarik.

let myPet = 'dog';

Dalam bahasa Inggris tertulis "Biarkan hewan peliharaan saya menjadi anjing"


5
Sementara asal mula let mungkin linguistik dan matematika, referensi dekat ke rumah tidak diragukan lagi pernyataan LET di semua versi bahasa pemrograman BASIC, salah satu yang banyak penulis ES6 akan mulai belajar jika mereka selesai 40 tahun.
wide_eyed_pupil

5
@wide_eyed_pupil Hanya FYI: sebagai lebih dari 40 (meskipun bukan penulis ES6) yang dibesarkan di BASIC, tidak ada komunitas yang saya gunakan menggunakan LET dalam praktik umum; kami baru saja menetapkan variabel, seperti yang dilakukan Python sekarang (misalnya A$="HELLO WORLD") Penerjemah yang terlibat termasuk Rockwell AIM 65 BASIC, Atari Basic, MBASIC 5 pada CP / M, Applesoft BASIC, dan bahkan BASCOM, kompiler MS BASIC pada CP / M. VAX BASIC memang memiliki LET, tetapi tidak memerlukannya, seingat saya. Memori sangat ketat saat itu, dan 3 atau 4 karakter tambahan dari teks program per pernyataan membuat perbedaan, terutama dalam program "besar".
Peter Hull

@PeterHull Itu menarik, saya melakukan pengkodean pertama saya pada kartu bertanda pensil yang terpasang pada CPU Digital, lalu mainframe di laboratorium penelitian pria tua itu dan Digital PDP8 di sekolah. tidak pernah melihat orang menggunakan LET tanpa benar-benar menggunakan pernyataan, tidak dalam buku yang saya baca. Pikiran Anda, saya didorong untuk kode dalam FORTRAN dan PASCAL segera setelah saya mendapatkan yang baik, dasar yang seburuk itu, bahkan tidak memiliki GOSUB (yaitu fungsi yang dapat digunakan kembali) dalam versi yang saya gunakan.
wide_eyed_pupil

Anda tidak bisa mendeklarasikan ulang variabel let.
CONvid19

10

Kemungkinan yang paling mungkin adalah bahwa itu adalah pilihan yang paling idiomatis. Tidak hanya mudah untuk berbicara, tetapi juga lebih intuitif untuk dipahami. Beberapa bisa berdebat, bahkan lebih dari itu var.

Tapi saya rasa ada sedikit lebih banyak sejarah untuk ini.

Dari Wikipedia :

Bahasa LCF Dana Scott adalah tahap dalam evolusi kalkulus lambda menjadi bahasa fungsional modern. Bahasa ini memperkenalkan ekspresi let, yang telah muncul di sebagian besar bahasa fungsional sejak saat itu.

Bahasa imperatif penuh negara seperti ALGOL dan Pascal pada dasarnya menerapkan ekspresi let, untuk mengimplementasikan lingkup fungsi terbatas, dalam struktur blok.

Saya ingin percaya ini adalah inspirasi juga, untuk letdi Javascript.


Jawaban ini merujuk pada kalkulus lambda 'mari berekspresi', yang mungkin bukan yang diminta OP. Dan tampaknya lebih lambat daripada LETdi BASIC, dari tahun 1964.
Joseph Quinsey

Seluruh artikel itu adalah satu dari beberapa tulisan yang pada dasarnya ditulis sendiri oleh pengguna Wikipedia Thepigdog pada tahun 2014. Saya akan bijak dan hanya mengatakan bahwa mereka semua ditulis dari perspektif yang sangat sempit, sehingga (yang sama sekali tidak direferensikan) klaim yang dikutip harus ditafsirkan sebagai mengatakan bahwa makalah Scott "memperkenalkan" ekspresi let to lambda calculus , dengan cara yang sama seperti ES6 diperkenalkan letke JavaScript. Tidak sepenuhnya tidak benar, sejauh kelanjutannya, tetapi tanpa signifikansi nyata. (Dan sama sekali tidak mengesampingkan kemungkinan bahwa penggunaan "biarkan" Scott juga diinspirasi oleh BASIC LET.)
FeRD

1

Biarkan menggunakan lingkup terbatas tingkat blok yang lebih langsung sedangkan var adalah lingkup fungsi atau lingkup global biasanya.

Tampaknya membiarkan dipilih karena kemungkinan besar ditemukan dalam begitu banyak bahasa lain untuk mendefinisikan variabel, seperti BASIC, dan banyak lainnya.


1

Saya pikir hutang JavaScript untuk Skema sudah jelas di sini. Skema tidak hanya memiliki let, tetapi memiliki let *, let * -values, let-syntax, dan let-values. (Lihat, Bahasa Pemrograman Skema, Edisi ke-4).

((Pilihan ini menambah kepercayaan lebih lanjut pada gagasan bahwa JavaScript adalah Lispy, tetapi - sebelum kita terbawa - bukan homoikonik.)))))


1

Bisa juga berarti sesuatu seperti "leksikal Lingkungan Jenis atau Terikat" .. itu mengganggu saya bahwa itu hanya akan "biarkan ini menjadi yang ". Dan biarkan rec tidak masuk akal dalam kalkulus lambda.


Saya sedang mencari jawaban seperti ini. Saya juga ragu itu memiliki arti bahasa Inggris umum "biarkan"
Meenohara
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.