Fonksiyonların Sözcüksel Çevresinin JavaScript'te Uygulanması
Diyelim ki sonucu başka bir fonksiyon döndüren bir fonksiyonumuz var:
function test() {
return function() {
}
}
Eğer ana fonksiyonun herhangi bir değişkeni varsa, bu değişkenler döndürülen fonksiyonun sözcüksel çevresinde yer alacaktır:
function test() {
let num = 1; // ana fonksiyonun değişkeni
return function() {
// sözcüksel çevre = {num: 1}
}
}
Döndürdüğümüz fonksiyonun koduna, değişkenin
değerini console.log ile yazdıran
bir kod ekleyelim:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
Şimdi test ana fonksiyonunu çağıralım
ve sonucunu func değişkenine kaydedelim:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func değişkenine döndürülen fonksiyon
yazılacaktır. Fonksiyonumuzu çağıralım - sonucu
num değişkeninin içeriğini yazdıracaktır:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func(); // 1 yazdırır
Eğer num değişkenini fonksiyonun dışında
yazdırmaya çalışırsak - erişilemez olacaktır:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
console.log(num); // num değişkeni burada erişilemez
Gördüğünüz gibi, yerel num değişkeni
fonksiyonumuzun sözcüksel çevresine bağlandı
ve şimdi, bu fonksiyonu kodun herhangi bir
yerinde çağırarak, num değişkeninin
değerini alabileceğiz, bu değişkenin çağrı
yapılan yerde kendi başına erişilemez olması
bile önemli değil.
Aslında benzer bir sonuca, num değişkenini
global yaparak da ulaşılabilir:
function test() {
return function() {
console.log(num);
}
}
let num = 1; // global değişken
let func = test();
func(); // 1 yazdırır
Ancak burada önemli bir fark olacak:
yeni versiyonda num değişkeni
fonksiyonların dışında değiştirilebilir
(çünkü global), ancak eskisinde - değiştirilemez.
Kodu çalıştırmadan, konsola ne yazdırılacağını belirleyin:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
Kodu çalıştırmadan, konsola ne yazdırılacağını belirleyin:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
Kodu çalıştırmadan, konsola ne yazdırılacağını belirleyin:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
Kodu çalıştırmadan, konsola ne yazdırılacağını belirleyin:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());