let
JavaScript'deki var
değişkenleri fonksiyon faaliyet alan'lıdır. Bu, değişkenlerin blok faaliyet alanlı olduğu diğer birçok dilden farklidir (C# / Java vb.). Eğer JavaScript'e blok faaliyet alanlı düşünce yapısı getirirseniz, aşağıdakilerin 123
çıktısı vermesini beklersiniz, bunun yerine 456
yazdıracaktır:
var foo = 123;
if (true) {
var foo = 456;
}
console.log(foo); // 456
Bunun nedeni ise {
yeni bir değişken faaliyet alanı yaratmaz. foo değişkeni, if bloğunun içinde olduğu gibi if bloğunun dışında da aynıdır. Bu, JavaScript programlamada yaygın bir hata kaynağıdır. Bu nedenle TypeScript (ve ES6) size değişkenleri doğru blok faaliyet alan'ları ile tanımlayabilmeniz için let
anahtar sözcüğünü sunar. Yani, var
yerine let
kullanırsanız, faaliyet alanının dışında tanımladıklarınızdan kopuk eşsiz bir eleman elde edersiniz. Aynı örneğin let
ile gösterimi :
let foo = 123;
if (true) {
let foo = 456;
}
console.log(foo); // 123
let
'in sizi hatalardan kurtaracağı bir başka yer ise döngülerdir.
var index = 0;
var array = [1, 2, 3];
for (let index = 0; index < array.length; index++) {
console.log(array[index]);
}
console.log(index); // 0
Samimiyetle, yeni ve mevcut çok dilli geliştiriciler için let
kullanımını, daha az sürprizlerle karşılaşacaklarından uygun buluyoruz.
Fonksiyonlar yeni faaliyet alanı oluşturur
Bahsettiğimizden beri, JavaScript'te fonksiyonların yeni bir değişken faaliyet alanı oluşturduğunu göstermek istiyoruz. Aşağıdaki gösterimi inceleyelim:
var foo = 123;
function test() {
var foo = 456;
}
test();
console.log(foo); // 123
Bu beklediğiniz gibi davranıyor. Aksi takdirde JavaScript'de kod yazmak çok zor olurdu.
Üretilmiş JS
TypeScript tarafından üretilen JS basitçe, let değişkenini çevreleyen faaliyet alanında benzer bir isim zaten varsa yeniden adlandırılmasıdır. Örneğin aşağıdaki var
değişkeninin let
ile basit bir yer değiştirmesi ile üretilir:
if (true) {
let foo = 123;
}
// şu hale gelir //
if (true) {
var foo = 123;
}
Ancak değişken ismi çevreleyen faaliyet alanı tarafından zaten alındıysa, yeni değişken ismi gösterildiği gibi üretilir (bakınız _foo
):
var foo = '123';
if (true) {
let foo = 123;
}
// şu hale gelir //
var foo = '123';
if (true) {
var _foo = 123; // yeniden adlandırılır
}
kapsanımlar içindeki let
Bir JavaScript geliştirici için alışılageldik bir programlama sorusu, bu basit dosya ne çıktı üretir:
var funcs = [];
// birkaç fonksiyon oluştur
for (var i = 0; i < 3; i++) {
funcs.push(function() {
console.log(i);
})
}
// ve onları çağır
for (var j = 0; j < 3; j++) {
funcs[j]();
}
Birileri bunun 0,1,2
olmasını beklerdi. Şaşırtıcı bir şekilde her üç işlev için 3
olacak. Bunun nedeni, her üç işlevin de i
değişkenini dış faaliyet alanında kullanıyor olması ve o anda bunları çalıştırdığımızda (ikinci döngü içinde) i
'nin değerinin 3
olması (bu, ilk döngü için sonlandırma koşuludur).
Doğrusu, o döngü tekrarlamasına özgü her döngüde yeni bir değişken oluşturmak olacaktır. Daha önce öğrendiğimiz gibi, yeni bir fonksiyon oluşturup onu anında çalıştırarak yeni bir değişken faaliyet alanı oluşturabiliriz, (örneğin sınıflardaki IIFE kalıbı (function() { /* body */ })();
) aşağıda gösterildiği gibi:
var funcs = [];
// birkaç fonksiyon oluştur
for (var i = 0; i < 3; i++) {
(function() {
var local = i;
funcs.push(function() {
console.log(local);
})
})();
}
// ve onları çağır
for (var j = 0; j < 3; j++) {
funcs[j]();
}
Burada fonksiyonlar, yerel değişkeni (uygun isimlendirmesi yerel
) kapatıyor (dolayısıyla kapsanım
denir) ve bunu, döngü değişkeni i
yerine kullanıyor.
Kapsanımların performans etkisine sahip olduğunu unutmayın (çevreleyen durumu tutmak zorundalar).
Döngü içerisindeki ES6 let
anahtar sözcüğü, önceki örnekteki gibi aynı davranışa sahip olurdu:
var funcs = [];
// birkaç fonksiyon oluştur
for (let i = 0; i < 3; i++) { // let kullanımını unutmayın
funcs.push(function() {
console.log(i);
})
}
// ve onları çağır
for (var j = 0; j < 3; j++) {
funcs[j]();
}
var
yerine let
kullanılması, her döngü tekrarlanmasında eşsiz bir i
değişkeni yaratır.
Özet
let
kodun büyük çoğunluğuna hakim olmak için son derece kullanışlıdır. Kodunuzun okunabilirliğini büyük ölçüde artırabilir ve programlama hatalarının olasılığını azaltır.