ES6'da “var” anahtar sözcüğünü kullanmak için herhangi bir neden var mı?


261

Babil'in ES6 için rehber diyor:

letyenidir var.

Görünüşe göre tek fark olmasıdır vargüncel kapsama alır fonksiyonu ise, letcari kapsama alır blokta . Bu cevapta bazı iyi örnekler var .

varES6 kodunda kullanmak için hiçbir neden göremiyorum . Belirli bir değişkeni tüm fonksiyona dahil etmek isteseniz bile, bunu , fiili kapsamı belirtmek için letne yapmalısınız var? Ve bir forbloğa veya başka bir şeye daha ince bir şey dahil etmek istiyorsanız , o zaman bunu da yapabilirsiniz.

Yani benim variçgüdüm ES6 kodunu yazarken tamamen kullanmayı bırakıyor.

Sorum şu, bu konuda yanlış mıyım? varTercih edilebilecek meşru bir dava var mı let?


3
Bunu henüz denemedim (henüz ES6 kodunu yazmadığımdan beri), ancak varbu değişkenin tüm işlevi kapsaması amaçlanan bilinçli bir gösterge olarak kullanılmasının yararlı bir "kendi kendini belgeleyen" kural olabileceği anlaşılıyor. .
jfriend00

10
letBir fonksiyonun en üstüne bir ifade koyarsanız , onu tüm fonksiyona dahil etmek istediğiniz kadar açık olduğunu düşünüyorum. Kullanmanın varbasitçe en üste yerleştirmekten daha net bir şey yaptığını sanmıyorum .
callum

11
Dürüst olmak gerekirse, varhala var olan tek neden , geriye dönük uyumluluk olduğuna inanıyorum . Öyle olmasaydı, vartamamen kaldırılmışlardı ya letda ilk etapta hiç tanıtılmamışlardı ; bunun yerine, baştan varberi olması gereken şeyin anlamını değiştiriyorlardı .
Jörg W Mittag

2
@RayToal Kyle Simpson'ın söylediklerinin% 97'sine katılıyorum, ancak kullanmaya devam etme nedenleri varbana göre zayıf görünüyor ve etrafta atlayan üçüncü bir değişken türünü garanti etmek için yeterli değil. A letfonksiyonunu bir fonksiyonun en üstüne yerleştirerek var, bir bloğa yazma niyetinden daha açık olan bir fonksiyonun kapsamını alabilirsiniz. - tuhaf). Eğer letbir fonksiyona atarsanız “sözdizimi yerine sadece farkı işaret eden konumdur” diye uyarıyor , ama bence bu iyi bir şey.
callum

2
@RayToal Ben de bu makaleyi okudum (bu tartışmayı okumadan hemen önce) ve onun çok zayıf vakası için gerçekten hayal kırıklığına uğradım var. varSaklamak için sunduğu örnekler haklı görünmektedir - ve ciddi kodlama hatalarına dayanmaktadır . Bir hatayla karşılaşmak ve bu hataları düzeltmek zorunda kalmak, ondan kurtulmak için dil işlevlerini kullanmaktan çok daha iyidir! Sırada ne var, çökmeleri önlemek için her şeyi bir deneme / yakalamaya koymanız önerilir mi? Bu bağlantının gerisi iyi ama o kısımla aynı fikirde değilim.
Mörre

Yanıtlar:


217

Doug Crockford tartışır letde bu noktada onun konuşma, "in daha iyi Parçaları ".

Mesele şu ki, letyanlış anlaşılma kaynaklarından kaçınıyor, esp. blok kapsamındaki dillerin belirlediği beklentileri olan programcılar için. Bir varsahiptir fonksiyon kapsamını o halde (o fonksiyonun boyunca görünür olan bir değişken bildirir) bakar o varmış gibi kapsamını engellemek .

var Makine tarafından üretilen kod gibi aşırı bir durumda hala faydalı olabilir, ancak orada çok zorluyorum.

( constAynı zamanda yeni ve bloğu kapsam vardır. Sonra let x = {'hi': 'SE'}size yeniden atayabilirsiniz xsonra ise const y = xsize yeniden atama edemez yyanlışlıkla size altından değişen bir şey tutar beri. Yani genellikle preferrable bu. Ama net olmak gerekirse, yine nesne üzerinde değişiklik y.hi = 'SO'sürece dondur.)

Gerçekçi olarak, izleniminiz ES6 için haklı: Evlat Edin ve . Kullanmayı kes .letconstvar

(In "Daha iyi Bölümleri" başka performansıyla neden Doug diyor ===sabitleme yerine eklendi sorunlarını== . ==Bazı "şaşırtıcı" sonuçlar üretir, bu yüzden sadece benimsemek ===.)


Açıklayıcı Bir Örnek

Mozilla Geliştirici Ağı , varamaçlandığı şekilde çalışmadığı bir örnek verir . Örnekleri, onclickweb sayfasında işleyicileri belirleyen gerçekçi bir örnek . İşte daha küçük bir test durumu:

var a = [];
(function () {
   'use strict';
   for (let i = 0; i < 5; ++i) { // *** `let` works as expected ***
     a.push( function() {return i;} );
   }
} ());
console.log(a.map( function(f) {return f();} ));
// prints [0, 1, 2, 3, 4]

// Start over, but change `let` to `var`.
// prints [5, 5, 5, 5, 5]

varbaşarısız olur çünkü tüm döngü yinelemeleri , döngü bittikten sonra ideğeri olan aynı fonksiyon kapsamındaki değişkeni paylaşır 5.


6
=== yerine === benimseme konusunda da aynı cevabı veriyor. İkincisi bozuldu, ancak ES standartları komitesi bunu değiştirmek istemedi, bu yüzden === Ne anlama geldiklerinden tam olarak emin değiller . ==hiç kırık değil. Bu sadece olarak tanımlanabilir equality comparison using coersiongöz atın github.com/getify/You-Dont-Know-JS/blob/master/...
AmmarCSE

13
@AmmarCSE, örtük baskılara dair harika bir 39 sayfalık dokümanıdır. Bunları programlama sırasında aklında kim tutabilir? Doug, stackoverflow.com/a/359509/1682419 adresinde özetlendiği gibi "kırılmış" anlamına geliyordu , kısacası, değer türleri tahmin ettiğimizden daha fazla değiştiğinde bit elde etmek kolaydır. Tüm bunları tahmin edebilir misiniz? [ '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] ]
Jerry101

2
Doğru, bu örneklerin çoğu bir dizi işleneni içerir. Singing'e ve bunun Nesneler için nasıl uygulandığına baktığınızda sonucu anlamak kolaydır . Bununla birlikte, eğer kırılma ile kastedilen bu ise, nereden geldiğini tamamen görüyorum. :-)
AmmarCSE

3
neden değiştirilemez olduğunda const kullanmıyorsunuz - sadece soruyorsunuz? Demek istediğim, asıl seçim arasında değil , ama arasında letve vevarletvarconst
shabunc 30.06.2016

4
vartasarlandığı gibi çalışır, ancak kaç kişinin beklediğini değil. Kullanılabilirlik hatası, uygulama hatası değil.
Jerry101

12

Doğru kodu yazıyorsanız, muhtemelen tüm varifadeleri letanlamsal değişiklikler olmadan ifadelere dönüştürebileceksiniz .

letBir tanımlayıcının görünür olduğu kapsamı düşürdüğü için tercih edilir. İlk kullanım alanında değişkenleri güvenli bir şekilde bildirmemizi sağlar.

consttercih edilir let. Bir referansı değiştirmek zorunda kalmazsanız, bir constbildirim kullanın . Bu, letbirimselleştirilmiş değişkenlerin varlığını azaltmak ve kodun nedenini genel olarak kolaylaştırmakla birlikte tüm faydalara sahiptir . Bir referansı mutasyona dönüştürmeniz gerekip gerekmediğinden emin değilseniz, constaçıkça yapmanız gerekeni bulana kadar bildiriniz.


5

Mutlaka hatalı olduğunu düşünmüyorum ama var kullanmanın uyarıları var. Temel olarak, letgeliştiricilerin, özellikle adlandırma çatışmalarıyla, JavaScript'in aptallıklarını aşmalarına yardımcı olmalıdır. varGörünen o ki, daha büyük bir kapsamı var, çünkü kapanma fonksiyonuna gitmek istiyor. Bir işlevin içindeki bir blok kapsamında kullanılabilen bir geçici değişkene ihtiyacınız olduğunda olduğu gibi, değişkene ihtiyaç duyduğunuz zamanlar olacaktır, aksi takdirde, letdeğişkenleri isimlendirmek, isimlendirmelerde uyuşmazlık olan geliştiricilere yardımcı olacaktır. Daha hafif bir notta, ES6'nın getirdiği zamandır let.


3
varBlok kapsamı dışında, tüm işlev içinde bir blokta geçici bir sıcaklık vardır. Yanıltıcı bir özellik.
Jerry101

1

Es6'da yalnızca "izin" kullanılması gerektiği konusunda hemfikirim. Bir "let" i yeniden bildiren AFIK, bir hata üretir (bu iyi), "var" ile değeri (sadece es5'teki "katı mod" da buna rağmen) geçersiz kılarsınız.


-4

let"Değişken eşit olsun" anlamına gelir. Bu bir bildiridir, başka bir deyişle, bir başlatma ve ödev.

constElbette "sabit" ifadesinin aksine - değişkenin zıttıdır.

Bazı diğer diller, bildirirken nesne yerine asıl nesnenin önekini kullanır (örneğin def, "tanımla işlevi" için kısa yoldur - "def" olduğu noktasını tamamen kaçırır).

Let Bu anlamsal tutarsızlığı Javascript'e ekler.

Mantıksal olarak, "let" anahtar sözcüğünün görevi bellek atamak olduğundan, sürekli bir şeyin eşit olmasını sağlayabilirsiniz.

Sorun, varanahtar kelimenin daha önce constdesteklendiğinden ortaya çıktığı için ortaya çıkıyor , bu nedenle geriye dönük uyumluluk vargereklilikleri anlamına gelmeyen değişkenlik anlamına geliyor. (Sabit bir değer atamak için de kullanılabilir.)

Bu nedenle, letyanlış pozisyonda tanıtımı . Biz lexically, bu yanlış olduğunu hatırlamak emin olmak için, onlar da bir sözcük kapsamını değiştirmeye karar letVS var, böylece ayıklarken tutarsızlık zihnimizde başında gelmektedir.

Başka bir deyişle, letinsanlar (dili koruyucular anlamına gelir) Javascript'in çok tutarlı olduğunu düşündükleri için, tüm deyimleri ve deyimleri özümsemiş, daha fazlasını arzu ettikleri için vardır.

Yan nota, vareğer adı geçen blokları kapak olarak ele almak istiyorsanız (bloklar kapak varolarak kullanılmadan önce tanıtıldığından ) "ok" bloklarında letçalışmaz , fakat yapar.


6
-1: bilgiçlikli, yararsızdır ve öncelikle görüşe dayalıdır.
Joel Mueller

fijiaaron burada bizimle şaka yapıyor.
Jerry101

Sözlükten hoşlanmadığınıza sempati duyuyorum letçünkü JavaScript’te aynı kategorideki diğer anahtar kelimelerin tonuyla aynıdır. Yine de bu soruyu cevaplamıyor ve özellikle iyi ifade edilmemiş. Aşağı oy
Aluan Haddad

3
letsadece daha fazla karmaşıklık isteyen geliştiriciler değildir. Aslında sezgisel olarak daha anlaşılabilir bir durumdur çünkü var-over'i kapatıp kapattığınızda, kapak varın son değerini korur, ancak aynı şeyi yaptığınızda, döngüdeki her kapatmanın kendi değeri vardır. la yukarıda @ Jerry101 örneği
TKoL
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.