You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/03-closure/article.md
+22-26Lines changed: 22 additions & 26 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -114,7 +114,7 @@ Aşağıdaki kodda Sözcüksel Ortam başlangıçta boş değildir. `say`'e sahi
114
114
115
115
`say()` fonksiyonu çağrısı sırasında dış değişkenler çağrılır, bu olaya daha detaylı bakacak olursak.
116
116
117
-
Fonksiyon ilk çalıştığında yeni bir Sözcüksel Çevre otomatik olarak yaratılır. Bu tüm fonksiyonlar için genel bir kuraldır. Bu Sözcüksel Çevre yerel değişkenlerin tutulması ve çağrının tüm parametrelerini tutar.
117
+
Fonksiyon ilk çalıştığında yeni bir Sözcüksel Ortam otomatik olarak yaratılır. Bu tüm fonksiyonlar için genel bir kuraldır. Bu Sözcüksel Ortam yerel değişkenlerin tutulması ve çağrının tüm parametrelerini tutar.
118
118
119
119
<!--
120
120
```js
@@ -129,7 +129,7 @@ say("Ahmet"); // Merhaba, Ahmet
129
129
-->
130
130
`say("Ahmet")` fonksiyonu çalıştığı sırada Sözcüksel Ortam aşağıdaki gibi olur:
Fonksiyon çağrıldığında ise iki tane sözcüksel ortam bulunmaktadır: içte olan(fonksiyon çağrısı için) ve dışta olan(evrensel):
135
135
@@ -138,7 +138,7 @@ Fonksiyon çağrıldığında ise iki tane sözcüksel ortam bulunmaktadır: iç
138
138
139
139
İç Sözcük ortamı `outer` ile Dış Sözcük Ortamına referans olur.
140
140
141
-
**Kod değişkene ulaşmak istediğinde -- önce İç Sözcük ortamında arara, daha sonra dış sözcüm ortamına bakar ve daha sonra daha dıştakine bakar bu şekilde zincirin en sonuna kadar devam eder**
141
+
**Kod değişkene ulaşmak istediğinde -- önce İç Sözcük ortamında arar, daha sonra dış sözcüm ortamına bakar ve daha sonra daha dıştakine bakar bu şekilde zincirin en sonuna kadar devam eder**
142
142
143
143
Eğer değişken hiçbir yerde bulunamazsa, sıkı modda hata verir. `use strict` kullanılmazsa tanımsız değişken yeni bir global değişken yaratır.
144
144
@@ -151,7 +151,7 @@ Arama olayı bizim yazdığımız kodlarda nasıl işliyor buna bakalım:
151
151
152
152
Şimdi bölümün ilk başında sorulan sorulara cevap bulunabilir.
153
153
154
-
**Bir fonksiyon dışta bulunan değişkenin en son değerini alır**
154
+
**Bir fonksiyon dışta bulunan değişkenin en son değerini alır.**
155
155
156
156
Bunun nedeni tanımlanan mekanizmadan dolayıdır. Eski değişkenler bir yere kaydedilmezler. Fonksiyon bunları istediğinde iç sözcük ortamından veya dış sözcük ortamından o anki değeri alır.
157
157
@@ -167,7 +167,7 @@ function selamVer() {
167
167
adi = "Mehmet"; // (*)
168
168
169
169
*!*
170
-
selamVer(); // Pete
170
+
selamVer(); // Mehmet
171
171
*/!*
172
172
```
173
173
@@ -179,7 +179,7 @@ selamVer(); // Pete
179
179
3.`selamVer()` fonksiyonu çalıştığında `adi` dğeişkenini dışarıdan alır. Bu`dış` sözcüksel ortamda değişkenin değeri `"Mehmet"`tir.
180
180
181
181
182
-
```smart header="Bir çağrı -- bir Sözcüksel Ortam"
182
+
```smart header="Bir Çağrı -- Bir Sözcüksel Ortam"
183
183
184
184
Fonksiyon Sözcük Ortamı her fonksiyon çağrıldığında yeniden yaratılır.
185
185
@@ -279,7 +279,7 @@ Okumaya devam etmeden yukarıdaki sorulara cevap vermeye çalışın.
279
279
Peki o zaman, şimdi cevaplar.
280
280
281
281
1. Hayır sıfırlayamaz. `sayac` yerel bir değişkendir ve dışarıdan erişilemez.
282
-
2. Her `sayacUret` çağrısı o fonksiyona ait Sözcüksel Çevre üretir, bunun da kendine ait `sayac` değişkeni bulunmaktadır. Öyleyse `sayac` değişkenleri her fonksiyon için bağımsızdır denebilir.
282
+
2. Her `sayacUret` çağrısı o fonksiyona ait Sözcüksel Ortam üretir, bunun da kendine ait `sayac` değişkeni bulunmaktadır. Öyleyse `sayac` değişkenleri her fonksiyon için bağımsızdır denebilir.
283
283
284
284
Örneğin:
285
285
@@ -315,7 +315,7 @@ Aşağıda `sayacUret` fonksiyonunun adımları gösterilmektedir, her şeyi anl
315
315
316
316
Başlangıçta sadece `sayacUret` fonksiyonu bulunmaktadır, çünkü bu fonksiyon tanımıdır. Henüz çalışmadı.
317
317
318
-
Tüm fonksiyonlar başlangıçta gizli bir `[[Environment]]` değişkeni alırlar, bu yaratılmaya dair üretilecek Sözcüksel Çevreye referans olur. Bunun hakkında henüz bilgi verilmedi, fakat teknik olarak bunu fonksiyonun nerede yaratıldığını bilmesi olarak anlayabilirsiniz.
318
+
Tüm fonksiyonlar başlangıçta gizli bir `[[Environment]]` değişkeni alırlar, bu yaratılmaya dair üretilecek Sözcüksel Ortama referans olur. Bunun hakkında henüz bilgi verilmedi, fakat teknik olarak bunu fonksiyonun nerede yaratıldığını bilmesi olarak anlayabilirsiniz.
319
319
320
320
Burada `sayacUret` Evrensel Sözcüksel Ortamda yaratıldı. Bundan dolayı `[[Environemnt]]` bu ortamın referansıdır.
321
321
@@ -327,7 +327,7 @@ Aşağıda `sayacUret` fonksiyonunun adımları gösterilmektedir, her şeyi anl
327
327
328
328
`sayacUret()` fonksiyonu çağrıldığında, bu fonksiyonun değişkenlerini ve argümanlarını tutmak için Sözcüksel Ortam yaratılır.
329
329
330
-
Her Sözcüksel Çevre iki şeyi tutar:
330
+
Her Sözcüksel Ortam iki şeyi tutar:
331
331
1. Yerel değişkenlere ait Ortamsal Kayıtlar. Bu durumda `let sayac` çalıştırıldığında yerel değişken olarak `sayac` tutulmaktadır.
332
332
333
333
2. Dış sözcüksel referans, bu fonksiyonun `[[Environment]]`'i dir. Burada `sayacUret` fonksiyonunun `[[Environment]]`'i evrensel sözcüksel ortama referans verir.
@@ -336,7 +336,7 @@ Aşağıda `sayacUret` fonksiyonunun adımları gösterilmektedir, her şeyi anl
336
336
337
337
3. `sayacUret()` fonksiyonu çalıştığında küçük bir iç fonksiyon yaratılır.
338
338
339
-
Fonksiyonun nasıl yaratıldığı yani Fonksiyon Tanımıyla mı yoksa Fonksiyon ifadesiyle mi yaratıldığı önemli değildir. Tüm fonksiyonlar bulunduğu sözcüksel ortama referans eden `[[Environment]]` özelliği ile yaratılırlar. Bundan dolayı en küçük fonksiyon bile bu özelliği içerir.
339
+
Fonksiyonun nasıl yaratıldığı yani Fonksiyon Tanımıyla mı yoksa Fonksiyon İfadesiyle mi yaratıldığı önemli değildir. Tüm fonksiyonlar bulunduğu sözcüksel ortama referans eden `[[Environment]]` özelliği ile yaratılırlar. Bundan dolayı en küçük fonksiyon bile bu özelliği içerir.
340
340
341
341
İçte olan yeni fonksiyon için `[[Environment]]` dğeişkeni var olan `sayacUret`'in Sözcüksel Ortamıdır.( Doğduğu yer )
342
342
@@ -351,20 +351,20 @@ Aşağıda `sayacUret` fonksiyonunun adımları gösterilmektedir, her şeyi anl
351
351
352
352
Bu fonksiyonun sadece bir satır kodu var: `return sayac++`, sadece bu çalışacaktır.
353
353
354
-
5. `sayac()` çağrıldığında, "boş" bir Sözcüksel Ortam yaratılır. hiçbir yerel değişkeni yoktur. Fakat `sayac`'ın `[[Environment]]`'i dış referans olarak kullanılır. Bundan dolayı, daha önceden yapılan `sayacUret()`'in değişkenlerine erişebilir. Oluşturulduğu yerder:
354
+
5. `sayac()` çağrıldığında, "boş" bir Sözcüksel Ortam yaratılır. hiçbir yerel değişkeni yoktur. Fakat `sayac`'ın `[[Environment]]`'i dış referans olarak kullanılır. Bundan dolayı, daha önceden yapılan `sayacUret()`'in değişkenlerine erişebilir. Oluşturulduğu yer:
355
355
356
356

357
357
358
358
Değişkene erişmesi gerekirse önce kendi yerel sözcüksel ortamına(boş), sonra daha önce çağrılan `sayacUret()`'in sözcüksel ortamına, en son evrensel ortama bakar.
359
359
360
-
`sayac` için arama yaptığında, en yakınında `sayacUret`'in sözcüksel çevresi bulunmaktadır.
360
+
`sayac` için arama yaptığında, en yakınında `sayacUret`'in sözcüksel ortamı bulunmaktadır.
361
361
362
362
Buradaki hafıza yönetimine dikkat ederseniz. `sayacUret()` çağrısı bittikten bir süre sonra, Sözcüksel ortam hafızada tutulur, çünkü içte bulunan fonksiyonun `[[Environment]]`'i `sayacUret`'e referans vermektedir.
363
363
364
364
Genel olarak, sözcüksel ortam objesi fonksiyon kullanılabilir olduğu sürece yaşar. Fonksiyon kullanılmadığında silinir.
365
365
366
366
367
-
6. `sayac()` sadece `sayac` değişkenini döndürmekle kalmaz, artırırda. Dikkat ederseniz değişiklik sadece "olduğu yerde" yapıldı. Var olan `sayac` değişkeni bulunduğu ortamda değiştirildi.
367
+
6. `sayac()`fonksiyonu sadece `sayac` değişkenini döndürmekle kalmaz, artırırda. Dikkat ederseniz değişiklik sadece "olduğu yerde" yapıldı. Var olan `sayac` değişkeni bulunduğu ortamda değiştirildi.
368
368
369
369

370
370
@@ -416,7 +416,7 @@ alert(kullanici); // Hata, böyle bir değişken bulunamamakta!
416
416
417
417

418
418
419
-
Yeni sözcüksel ortam bilgileri dış çevreden alabilir, bundan dolayı `ifade` erişilebilirdir. Fakat `if` içerisindeki tüm değişkenler ve Fonksiyonel ifadeler kendi Sözcüksel Çevresinden erişilebilir, dışarıdan erişilemez.
419
+
Yeni sözcüksel ortam bilgileri dış çevreden alabilir, bundan dolayı `ifade` erişilebilirdir. Fakat `if` içerisindeki tüm değişkenler ve Fonksiyonel ifadeler kendi Sözcüksel Ortamdan erişilebilir, dışarıdan erişilemez.
420
420
421
421
Örneğin `if` bittikten sonra `kullanici` değişkeni görünmez olacaktır.
422
422
@@ -446,7 +446,7 @@ Döngüden sonra `i` görünmez olur.
446
446
447
447
Bu değişken isimleri genel kullanılırsa ve kod yazan kişi diğer değişkenin kullanıldığını bilmiyor ise yaşanılacak bir olaydır.
448
448
449
-
Bunlardan kaçınmak için bir kod bloğu oluşturarak dışarıda bulunan evrensel ortamdan isole edilebilir:
449
+
Bunlardan kaçınmak için bir kod bloğu oluşturarak dışarıda bulunan evrensel ortamdan izole edilebilir:
450
450
451
451
```js run
452
452
{
@@ -568,13 +568,12 @@ Sözcüksel Ortam objeleri aynı normal değerler gibi hafıza yönetimine konu
568
568
return function() { alert(deger); };
569
569
}
570
570
571
-
// 3 functions in array, every of them links to Lexical Environment
572
571
// Dizideki 3 fonksiyon da kendine ait sözcüksel ortama sahiptirler.
573
572
// LE LE LE
574
573
let arr = [f(), f(), f()];
575
574
```
576
575
577
-
- Sözcüksel Ortam objesi erişim kalmayınca ölür. Bu iç içe fonksiyonların referansı kalmadığında meydana gelir. Aşağıdaki kodda `g` erişilemez olduğunda `value`'da hafızadan silinir.
576
+
- Sözcüksel Ortam objesi erişim olmayınca ölür. Bu iç içe fonksiyonların referansı kalmadığında meydana gelir. Aşağıdaki kodda `g` erişilemez olduğunda `value`'da hafızadan silinir.
578
577
```js
579
578
function f() {
580
579
let value = 123;
@@ -584,21 +583,18 @@ Sözcüksel Ortam objeleri aynı normal değerler gibi hafıza yönetimine konu
584
583
return g;
585
584
}
586
585
587
-
let g = f(); // g canlı olursa
588
-
ona karşılık gelen Sözcüksel Ortam'da hayatta kalır.
586
+
let g = f(); // g canlı olursa ona karşılık gelen Sözcüksel Ortam'da hayatta kalır.
589
587
590
588
g = null; // şimdi hafıza temizlendi.
591
589
```
592
590
593
-
### Gerçek-hayat Optimizasyonu
591
+
### Gerçek-Hayat Optimizasyonu
594
592
595
593
Görüldüğü üzere, teoride bir fonksiyon hayatta olduğun sürece onun dışındaki ona bağlı değişkenler de hayatta kalır.
596
594
597
595
Pratikte ise, JavaScript motoru bunu optimize eder. Değişken kullanımını analiz eder ve eğer dışarıdaki fonksiyonun kullanılmadığı açık ise silinir.
598
596
599
-
**An important side effect inV8 (Chrome, Opera) is that such variable will become unavailable in debugging.**
600
-
601
-
**Bunun V8 ( Chrome, Opera)'daki yan etkisi ise böyle değişkenlerin debugging sırasında da görünememesidir.
597
+
**Bunun V8 ( Chrome, Opera)'daki yan etkisi ise böyle değişkenlerin debugging sırasında da görünememesidir.**
602
598
603
599
Aşağıdaki örneğin Chrome'da konsolu açarak test ediniz.
604
600
@@ -642,8 +638,8 @@ g();
642
638
643
639
```warn header="Görüşmek üzere!"
644
640
645
-
V8'in bu özelliğini bilmekte fayda var. Eğer Chrome/Opera ile ayıklama yapıyorsanız, er geç bu özellikle tanışacaksınız.
641
+
V8'in bu özelliğini bilmekte fayda var. Eğer Chrome/Opera ile debugging yapıyorsanız, er ya da geç bu özellikle tanışacaksınız.
646
642
647
-
Bu ayıklayıcının(debugger) bir problemi değil, V8 motorunun bir özelliğidir. Belki ileride bu özellik değişebilir.
648
-
Bu sayfayadaki örneği çalıştırarak her zaman kontrol edebilirsiniz.
643
+
Bu bir debugger problemi değil, V8 motorunun bir özelliğidir. Belki ileride bu özellik değişebilir.
644
+
Bu sayfayadaki örneği çalıştırarak her zaman bunu kontrol edebilirsiniz.
0 commit comments