JavaScript'teki blok kapsamındaki değişken bildirimleri için neden 'let' adı seçildi?


306

varBu adı neden aldığını anlıyorum - değişken, const- sabit, ama adın arkasındaki anlam nedir, letmevcut bloğu kapsamaktadır? Varsın olsun?


7
1962'de icat edilen BASIC kullanılmıştır LET. Daha önceki dil örnekleri olabilir.
David R Tribble

5
TEMEL icat edildi 1964 değil, 1962. Ayrıca bkz burada . Kullanımı LET, kitapçığın Mayıs 1964 tarihli ilk taslağının 7. sayfasında pdf .
Joseph Quinsey

Daha spesifik constolarak, nesnenin kendisinin hala değişebildiği sabit veya değişmez (salt okunur) bir nesne referansıdır. Örneğin. Beyan / atamadan sonra const foo = ['bar'], foo.push('bat')yine de yasal olacaktır, ancak foo = ['bar', 'bat']değildir. Ama bu çok fazla yazı yazmak.
user982671

Yanıtlar:


372

Let, Scheme ve Basic gibi erken programlama dilleri tarafından benimsenen matematiksel bir ifadedir. Değişkenler, daha yüksek soyutlama seviyeleri için uygun olmayan düşük seviyeli varlıklar olarak kabul edilir, bu nedenle birçok dil tasarımcının letbir değer veya atanabilecek bir değişken anlamına gelebilecek Clojure, F #, Scala gibi benzer ama daha güçlü kavramlar sunma isteği , ancak değiştirilmedi , bu da derleyicinin daha fazla programlama hatası yakalamasını ve kodu daha iyi optimize etmesini sağlar.

JavaScript varbaşlangıçtan beri var, bu yüzden sadece başka bir anahtar kelimeye ihtiyaçları vardı ve JavaScript'te bunun yerine blok kapsamı yerel değişkeni oluştursa da , mümkün olduğunca letyakın bir geleneksel anahtar kelime olarak kullanan düzinelerce dilden ödünç alındı .varlet


94
Resmi Mozilla Belgeleri sayfası bu soru için bu sayfayı
alıntılar

9
Ayrıca len('var') === len('let'), beyanlarınızın her iki şekilde de düzenleyicinizde güzel bir şekilde sıralanması anlamına gelir. Bunun kasıtlı olduğunu önermek için henüz bir şey bulamadım, ancak ya) görsel olarak hoş ve daha okunabilir olabilir ya da b) ikisini karıştırırsanız hata ayıklamak için korkunç bir şekilde can sıkıcı olabilir (yine de kötü bir fikir gibi görünüyor, ama ben ' yapıldığını gördüm).
brichins

13
Başka bir deyişle, letgeleneksel olarak bir sabiti tanımlamak için kullanılmıştır, let C = the speed of lightbu nedenle Javascript standart dışı kapsam belirleme ile bir değişkeni tanımlamaya ve aynı zamanda sabitler için başka bir anahtar kelime kullanmaya izin verdi.
fijiaaron

1
Ben buna letyakın değilim var. Ayrıca Scala kullanmıyor, letbu yüzden nasıl alakalı olduğunu görmüyorum.
Aluan Haddad

3
@fijiaaron: Standart dışı kapsam nasıl? Tüm-fonksiyon-ne olursa olsun-ne-blok-sen-ilan-o-ilan-ile garip değil mi?
SamB

78

Sanırım matematiksel geleneği takip ediyor. Matematikte sık sık "x'in keyfi gerçek sayı olmasına izin ver" ya da böyle söylenir.


Bu cevabı, hepimiz cebir geçtikçe kısa ve oldukça ilişkili olduğu için daha çok tercih ediyorum, muhtemelen diğerlerinin işaret ettiği gibi bir açıklama gelmelidir.
duduwe

69

Ekleme exebook yanıtına , anahtar kelimenin matematik kullanım izin de kuyunun kapsam etkileri kapsüller letJavaScript / ES6 kullanıldığında. Özellikle, aşağıdaki ES6 kodunun değerini yazdırdığı zaman parantez içindeki atamanın farkında olmadığı gibi ,toPrint 'Hello World'

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

İzin Vermek resmi bir matematik (delillerinden özellikle yazma) kullanılan bir değişken geçerli örneği sadece mantıksal fikrinin kapsamı için var olduğunu gösterir. Aşağıdaki örnekte, x, yeni fikre girdikten hemen sonra yeni bir kimlik kazanır (genellikle bunlar ana fikri kanıtlamak için gerekli olan kavramlardır) ve alt kanıtın sonuçlanmasından hemen sonra eski x'e geri döner. Tabii ki, kodlamada olduğu gibi, bu biraz kafa karıştırıcı olarak kabul edilir ve bu nedenle diğer değişken için farklı bir ad seçerek genellikle önlenir.

X öyle olsun ...

  İspat malzemeleri

 Yeni Fikir {x başka bir şey olsun ... bir şey kanıtlayın} Yeni Fikir Sonuç

 Eski x ile ana fikri kanıtlayın


19
Bunun gerçekten faydalı olduğunu düşünüyorum. Kabul edilemez cevap, değiştirilemeyen değerin bahsettiği için, neredeyse hiç yanıltıcı değildir let. lettamamen kapsamla ilgilidir.
jinglesthula

Sadece bir düşünce: letbana kod yazarının aklında böyle bir şey olduğunu düşündürüyor, "Tamam, sadece şu an için let foo = bar, ama sonra orijinal değerine geri dönebilir ya da durdurulabilir. W3Schools sunumundaki Blok Kapsamı ve Yeniden Değişken Değişkenleri için örnekler ait let. Yine bir tür bilimsel cevap getirmek gibi davranarak değil, ama kullanmak istediğinizde hatırlamak için bir anımsatıcı aygıtı olarak bu daha paylaşmak let.
Alain

Bence, kavramsal netlik uğruna, burada biraz daha kesin olmaya değer. Örnek ES6 kodunuz "parantez içindeki atamayı yoksaymaz". Görevi talimatlara göre, yalnızca blok içinde var olan yeni bir değişken üzerindetoPrint gerçekleştirir ve sonra blok sona erdiğinde bu değişkeni gereksiz yere atar. Ve Çıkışta, biz iç dış kapsam, konum geri toPrintartık yok, bu yüzden console.log(toPrint)atıfta dış toPrint . Hiçbir şey göz ardı edilmez, sadece letdeğişkenlerin kapsamlarıyla tanımlanan sınırlı ömürleri vardır.
FeRD

1
@FeRD, mükemmel bir nokta. Ben noktayı şaşırtır gibi "yoksay" kelimesinin kullanımını kaldırmak için yukarıdaki bir düzenleme yaptım.
Evan White

36

varBir kapsam farkı ile tam olarak ne yapar. Şimdi varzaten alındığı için adı alamaz .

Bu yüzden ilginç bir İngilizce dil yapısında bir semantik olan bir sonraki en iyi adı almış gibi görünüyor.

let myPet = 'dog';

İngilizce'de "Evcil hayvanımın köpeği olsun" yazıyor


5
Let'nin kaynağı dilsel ve matematiksel olsa da, eve yakın referans şüphesiz BASIC programlama dilinin tüm sürümlerinde LET ifadesidir, ES6 yazarlarının birçoğu biterse öğrenmeye başlayacaktı 40 yaşında.
wide_eyed_pupil

5
@wide_eyed_pupil Sadece FYI: BASIC üzerinde büyüyen 40'tan fazla (ES6 yazarı olmasa da), ben dahil olduğum toplulukların hiçbiri ortak uygulamada LET kullandı; Python'un şimdi yaptığı gibi değişkenler verdik (örneğin A$="HELLO WORLD") İlgili tercümanlar arasında Rockwell AIM 65 BASIC, Atari Basic, CP / M'de MBASIC 5, Applesoft BASIC ve hatta CP / M'deki MS BASIC derleyicisi BASCOM da vardı. VAX BASIC, LET'e sahipti, ancak hatırladığım gibi gerektirmedi. O zamanlar bellek sıkıydı ve ifade başına program metninin 3 veya 4 ekstra karakteri, özellikle "büyük" programlarda bir fark yarattı.
Peter Hull

@PeterHull Bu ilginç, ilk kodumu Dijital CPU'ya bağlı kalem işaretli kartlar üzerine, sonra yaşlı adamın araştırma laboratuvarında ana bilgisayarlar ve okulda bir Dijital PDP8 yaptım. Bir zamanlar insanların ifadeyi kullanmadan LET kullandığını görmedim, okuduğum kitaplarda da görmedim. Unutmayın ki kullandığım sürümlerde GOSUB (yani yeniden kullanılabilir fonksiyonlar) bile olmamakla birlikte, herhangi bir iyi, temel varlık kadar kötü olduğu için FORTRAN ve PASCAL'de kodlamaya teşvik edildim.
wide_eyed_pupil

Bir izin değişkeni yeniden bildiremezsiniz.
CONvid19

10

En olası olasılık, en deyimsel seçenek olmasıydı. Sadece konuşmak kolay değil, aynı zamanda anlaşılması da sezgiseldir. Bazıları, daha da fazlasını tartışabilir var.

Ama bunun biraz daha tarihi olduğunu düşünüyorum.

Gönderen Vikipedi :

Dana Scott'ın LCF dili, lambda hesabının modern işlevsel dillere evriminde bir aşamaydı. Bu dil, o zamandan beri çoğu işlevsel dilde ortaya çıkan let ifadesini tanıttı.

ALGOL ve Pascal gibi devlet tarafından doldurulması zorunlu diller temel olarak blok yapılarında fonksiyonların kısıtlı kapsamını uygulamak için bir izin ifadesi uygular.

Bunun letJavascript'te de bir ilham kaynağı olduğuna inanmak istiyorum .


Bu cevap, muhtemelen OP'nin sorduğu şey değil, lambda hesabı 'ifadeyi bırak' anlamına gelir. Ve LET1964'ten itibaren
BASIC'ten

Bu makalenin tamamı, Vikipedi kullanıcısı Thepigdog tarafından 2014'te tek başına yazılmış birkaç makaleden biridir. Scott'ın makalesinin , ES6'nın JavaScript'e tanıttığı gibi lambda hesabına izin ifadesini "tanıttığını" söyleyerek yorumladı let. Tamamen yanlış, gittiği kadarıyla, ama gerçek bir önemi yok. (Ve hiçbir şekilde Scott'ın "izin" kullanımının daLET
TEMEL'ten

1

Izin vermek daha acil bir blok seviyesi sınırlı kapsam kullanırken var fonksiyon tipik veya küresel kapsam.

Büyük olasılıkla seçilmiş gibi görünüyor çünkü BASIC ve diğer birçok değişkeni tanımlamak için birçok dilde bulundu.


1

Bence JavaScript'in Scheme'e olan borcu burada açık. Şema sadece izin vermekle kalmadı, *, let * -values, let-syntax ve let-değerlerine de sahip. (Bkz. Şema Programlama Dili, 4. Baskı.).

((Seçim, JavaScript'in Lispy olduğu fikrine daha fazla güven verir, ancak - taşınmadan önce - homoikonik değil.))))


1

Bu "Sözcük Çevre Tipi veya Bağlı" gibi ortalama bir şey de olabilir .. O basitçe "izin verir ki beni rahatsız bu olması olduğunu ". Ve rec lambda hesabında mantıklı gelmesin.


Ben böyle bir cevap arıyordum Ben de "let" genel İngilizce anlamı olduğundan şüphe
Meenohara
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.