|
| 1 | +## `this` Nasıl Çalışır |
| 2 | + |
| 3 | +JavaScript'te `this` özel kelimesinin anlamı diğer programlama dillerinden |
| 4 | +farklıdır. `this` kelimesinin birbirinden farklı anlamlar yüklendiği tam |
| 5 | +**beş** durum vardır. |
| 6 | + |
| 7 | +### Genel kapsam |
| 8 | + |
| 9 | + this; |
| 10 | + |
| 11 | +`this` kelimesi genel kapsamda kullanıldığında *global* nesneye işaret eder. |
| 12 | + |
| 13 | + |
| 14 | +### Bir fonksiyon çağırma |
| 15 | + |
| 16 | + foo(); |
| 17 | + |
| 18 | +Burada `this` yine *global* nesneye işaret eder. |
| 19 | + |
| 20 | +> **ES5 Notu:** Mutlak modda bu davranış **kaldırılmıştır**. Bu durumda `this` |
| 21 | +> kelimesinin değeri `undefined` olacaktır. |
| 22 | +Here `this` will again refer to the *global* object. |
| 23 | + |
| 24 | +### Bir metod çağırma |
| 25 | + |
| 26 | + test.foo(); |
| 27 | + |
| 28 | +Bu örnekte `this` kelimesi `test` 'e işaret edecektir. |
| 29 | + |
| 30 | +### Bir nesne oluşturucu çağırma |
| 31 | + |
| 32 | + new foo(); |
| 33 | + |
| 34 | +Bir fonksiyon başında `new` anahtar kelimesi ile birlikte çağrılırsa bir |
| 35 | +[nesne oluşturucu](#function.constructors) olarak davranır. Bu fonksiyonun |
| 36 | +içinde `this` kelimesi *yeni oluşturulan* `Object` 'e işaret eder. |
| 37 | + |
| 38 | +### `this` kelimesinin atanması |
| 39 | + |
| 40 | + function foo(a, b, c) {} |
| 41 | + |
| 42 | + var bar = {}; |
| 43 | + foo.apply(bar, [1, 2, 3]); // dizi aşağıdaki gibi açılır |
| 44 | + foo.call(bar, 1, 2, 3); // sonuç: a = 1, b = 2, c = 3 |
| 45 | + |
| 46 | +`Function.prototype` 'ın `call` veya `apply` metodları kullanıldığında, çağrılan |
| 47 | +fonksiyonun içinde `this` 'in değeri ilk argümanın değeri olarak **atanır**. |
| 48 | + |
| 49 | +Sonuç olarak, yukarıdaki örnekte *metod çağırma* durumu geçerli **olmayacak**, |
| 50 | +bunun yerine `foo` fonksiyonu içinde `this` 'in değeri `bar` olacaktır. |
| 51 | + |
| 52 | +> **Not:** `this` kelimesi bir `Object` değişmezi içinde nesnenin kendisine |
| 53 | +> işaret etmek için **kullanılamaz**. Yani `var obj = {me: this}` gibi bir |
| 54 | +> ifadede `me`, `obj` nesnesine işaret **etmeyecektir**, `this` sadece yukarıda |
| 55 | +> açıklanan beş durumdan biri ile kullanılabilir. |
| 56 | +
|
| 57 | +### Sık düşülen yanılgılar |
| 58 | + |
| 59 | +Yukarıdaki durumların çoğu mantıklı görünse bile, ilk durum dilin tasarım |
| 60 | +hatalarından biri olarak değerlendirilmelidir çünkü **hiçbir** pratik |
| 61 | +kullanılımı yoktur. |
| 62 | + |
| 63 | + |
| 64 | + Foo.method = function() { |
| 65 | + function test() { |
| 66 | + // this genel nesneye işaret eder |
| 67 | + } |
| 68 | + test(); |
| 69 | + } |
| 70 | + |
| 71 | +Bir başka yanılgı `test` fonksiyonunun içinde `this` 'in `Foo` 'ya işaret |
| 72 | +edeceğinin sanılmasıdır, ama bu **doğru değildir**. |
| 73 | + |
| 74 | +`test` fonksiyonu içinden `Foo` 'ya erişmenin yolu `method` içinde bir lokal |
| 75 | +değişken oluşturmaktır. |
| 76 | + |
| 77 | + Foo.method = function() { |
| 78 | + var that = this; |
| 79 | + function test() { |
| 80 | + // Burada this yerine that kullanın |
| 81 | + } |
| 82 | + test(); |
| 83 | + } |
| 84 | + |
| 85 | +`that` kelimesinin dilde özel bir anlamı yoktur, ama sıklıkla dış kapsamdaki |
| 86 | +`this` 'e işaret etmek için kullanılır. Bu yöntem [closure](#function.closures) |
| 87 | +kavramı ile birlikte kullanıldığında `this` değerini program içinde taşımaya da |
| 88 | +yarar. |
| 89 | + |
| 90 | +### Metodları değişkenlere atamak |
| 91 | + |
| 92 | +JavaScript'te mevcut **olmayan** bir başka özellik de fonksiyon isimlendirmedir, |
| 93 | +başka bir deyişle bir metodu bir değişkene **atamak**. |
| 94 | + |
| 95 | + var test = someObject.methodTest; |
| 96 | + test(); |
| 97 | + |
| 98 | +İlk durum nedeniyle `test` artık sıradan bir fonksiyon olarak davranacaktır; bu |
| 99 | +nedenle `test` fonksiyonu içinde `this` artık `someObject` 'e işaret |
| 100 | +etmeyecektir. |
| 101 | + |
| 102 | +`this` kelimesinin geç bağlanması ilk bakışta yanlış görünse de, aslında |
| 103 | +[prototipsel kalıtımı](#object.prototype) mümkün kılan şey budur. |
| 104 | + |
| 105 | + function Foo() {} |
| 106 | + Foo.prototype.method = function() {}; |
| 107 | + |
| 108 | + function Bar() {} |
| 109 | + Bar.prototype = Foo.prototype; |
| 110 | + |
| 111 | + new Bar().method(); |
| 112 | + |
| 113 | +Yukarıda `Bar` sınıfına ait bir nesnenin `method` 'u çağrıldığında `this` bu |
| 114 | +nesneye işaret edecektir. |
| 115 | + |
| 116 | + |
0 commit comments