Skip to content

Commit 15e3f47

Browse files
committed
translated function/closures
1 parent 2fce77c commit 15e3f47

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

doc/tr/function/closures.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
## Closure ve Referanslar
2+
3+
JavaScript'in en güçlü özelliklerinden biri de *closure* 'lara sahip olmasıdır.
4+
Bunun anlamı her hangi bir kapsamın **her zaman** kendisini içeren kapsama
5+
erişebilmesidir. JavaScript'te tek kapsam [fonksiyon kapsamı](#function.scopes)
6+
olduğu için temelde tüm fonksiyonlar `closure` 'durlar.
7+
8+
### Private değişkenler
9+
10+
function Counter(start) {
11+
var count = start;
12+
return {
13+
increment: function() {
14+
count++;
15+
},
16+
17+
get: function() {
18+
return count;
19+
}
20+
}
21+
}
22+
23+
var foo = Counter(4);
24+
foo.increment();
25+
foo.get(); // 5
26+
27+
Burada, `Counter` **iki** `closure` verir: `increment` fonksiyonu ve `get`
28+
fonksiyonu. Bu iki fonksiyon da `Counter` fonksiyonun kapsamına ait bir
29+
**referans** 'a sahiptir, ve bu nedenle söz konusu kapsamda tanımlanmış olan
30+
`count` değişkenine erişebilirler.
31+
32+
### Private değişkenler nasıl işler
33+
34+
JavaScript'te kapsam referanslarına erişmek yada atama yapmak mümkün olmadığı
35+
için, dış kapsamdan `count` değişkenine ulaşmak **mümkün değildir**. Bu
36+
değişkene ulaşmanın tek yolu yukarıdaki iki `closure` 'dur.
37+
38+
var foo = new Counter(4);
39+
foo.hack = function() {
40+
count = 1337;
41+
};
42+
43+
Bu program parçası `Counter` fonksiyonun kapsamındaki `count` değişkeninin
44+
değerini **değiştirmez**, çünkü `foo.hack` **bu kapsamda** tanımlanmamıştır.
45+
Bunun yerine *global* kapsamda yeni bir değişen oluşturur (yada mevcut bir
46+
değişkeni değiştirir).
47+
48+
### Döngü içinde closure
49+
50+
Sık yapılan bir hata, döngü içinde closure kullanıp döngünün indeks değişkeninin
51+
değerinin kopyalanacağını varsaymaktır.
52+
53+
for(var i = 0; i < 10; i++) {
54+
setTimeout(function() {
55+
console.log(i);
56+
}, 1000);
57+
}
58+
59+
Yukarıdaki örnek çıktı olarak `0` - `9` arası sayıları vermek yerine, `10`
60+
sayısını on kez yazacaktır.
61+
62+
İçteki *isimsiz* fonksiyon `i` değişkeninin değerine değil referansına sahiptir
63+
ve `console.log` çağrıldığında, `for` döngüsü çoktan tamamlanmış ve `i`
64+
değişkeninin değeri `10` olmuştur.
65+
66+
İstenen davranışı elde etmek için `i` değişkeninin değerinin **kopyalanması**
67+
gerekir.
68+
69+
### Referans probleminin çözümü
70+
71+
Döngünün indeks değişkeninin değerini kopyalamanın en iyi yolu bir
72+
[isimsiz fonksiyon](#function.scopes) kullanmaktır.
73+
74+
for(var i = 0; i < 10; i++) {
75+
(function(e) {
76+
setTimeout(function() {
77+
console.log(e);
78+
}, 1000);
79+
})(i);
80+
}
81+
82+
Dıştaki isimsiz fonksiyon her adımda çağrılacak ve `e` parametresi olarak
83+
`i` 'nin **değerinin** bir kopyası verilecektir.
84+
85+
`setTimeOut` fonksiyonuna verilen isimsiz fonksiyon artık `e` 'ye ait bir
86+
referansa sahip olacaktır, ve referansın değeri döngü tarafından
87+
**değiştirilmeyecektir**.
88+
89+
Bu davranışı başka bir yolla da elde etmek mümkündür; isimsiz fonksiyondan başka
90+
bir fonksiyon döndürmek. Bu durumda yukarıdaki ile aynı davranış elde
91+
edilecektir.
92+
93+
for(var i = 0; i < 10; i++) {
94+
setTimeout((function(e) {
95+
return function() {
96+
console.log(e);
97+
}
98+
})(i), 1000)
99+
}
100+

0 commit comments

Comments
 (0)