|
| 1 | +### `setTimeout` ve `setInterval` |
| 2 | + |
| 3 | +JavaScript asenkron olduğu için bir `setTimeout` ve `setInterval` kullanarak bir |
| 4 | +fonksiyonun ileri bir zamanda çalışmasını sağlamak mümkündür. |
| 5 | + |
| 6 | +> **Not:** Zamanlama fonksiyonları ECMAScript Standartına dahil **değildir**, |
| 7 | +> [DOM][1] ile birlikte tanımlanırlar. |
| 8 | +
|
| 9 | + function foo() {} |
| 10 | + var id = setTimeout(foo, 1000); // 0'dan büyük bir sayı verir |
| 11 | + |
| 12 | +Yukarıdaki örnekte `setTimeout` fonksiyonu çağrıldığında, oluşturulan |
| 13 | +zamanlayıcı tanımlayan bir ID sayısı verir ve `foo` fonksiyonu **yaklaşık** |
| 14 | +bin milisaniye sonra çalıştırılmak üzere programlanır. `foo` fonksiyonu |
| 15 | +tam olarak **bir** kez çağrılacaktır. |
| 16 | + |
| 17 | +Kullanılan JavaScript motorunun zamanlayıcı hassasiyetine bağlı olarak, ve |
| 18 | +ayrıca JavaScript tek `thread` ile çalıştığı ve çalışan başka program |
| 19 | +parçaları bu tek `thread` 'i bloke edeceği için, `setTimeout` ile belirlenen |
| 20 | +erteleme süresinin tam olarak gerçekleşeceği **hiçbir şekilde** garanti |
| 21 | +edilemez. |
| 22 | + |
| 23 | +İlk argüman olarak verilen fonksiyon *global nesne* tarafından çağrılacaktır, |
| 24 | +yani çağrılan fonksiyonun içinde [`this`](#function.this) bu nesneye işaret |
| 25 | +edecektir. |
| 26 | + |
| 27 | + function Foo() { |
| 28 | + this.value = 42; |
| 29 | + this.method = function() { |
| 30 | + // this global nesneye işaret eder |
| 31 | + console.log(this.value); // undefined yazar |
| 32 | + }; |
| 33 | + setTimeout(this.method, 500); |
| 34 | + } |
| 35 | + new Foo(); |
| 36 | + |
| 37 | + |
| 38 | +> **Not:** `setTimeout` fonksiyonunun ilk parametresi bir **fonksiyon nesnesi** |
| 39 | +> olduğu için, sık yapılan bir hata `setTimeout(foo(), 1000)` şeklindeki |
| 40 | +> kullanımdır, fakat bu şekilde, `foo` fonksiyonu **değil** `foo` fonksiyonunun |
| 41 | +> **sonuç değeri** parametre olarak kullanacaktır. Bu kullanım genellikle bir |
| 42 | +> hata mesajı üretmez, çünkü fonksiyon `undefined` değerini verdiğinde |
| 43 | +> `setTimeout` bir hata **oluşturmayacaktır**. |
| 44 | +
|
| 45 | +### `setInterval` ile fonksiyon çağrılarının yığılması |
| 46 | + |
| 47 | +`setTimeout` verilen fonksiyonu bir kez çağırırken, `setInterval` (adından da |
| 48 | +anlaşılacağı gibi) verilen fonksiyonu **her** `X` milisaniyede bir çağırır. |
| 49 | +Fakat kullanılması önerilmez. |
| 50 | + |
| 51 | +Mevcut program parçası çalışırken zamanlama bloke olduğu halde, `setInterval` |
| 52 | +verilen fonksiyonu çağırmaya devam edecektir. Bu da, özellikle küçük aralıklarla |
| 53 | +kullanıldığında, fonksiyon çağrılarının istiflenmesine neden olur. |
| 54 | + |
| 55 | + function foo(){ |
| 56 | + // 1 saniye süren bir işlem |
| 57 | + } |
| 58 | + setInterval(foo, 100); |
| 59 | + |
| 60 | +Yukarıdaki örnekte `foo` fonksiyonu bir kez çağrılıp bir saniye boyunca bloke |
| 61 | +edecektir. |
| 62 | + |
| 63 | +`foo` programı bloke etmişken, `setInterval` fonksiyon çağrılarını zamanlamaya |
| 64 | +devam edecektir. `foo` tamamlandığında, çalıştırılmatı bekleyen **on** çağrı |
| 65 | +daha olacaktır. |
| 66 | + |
| 67 | +### Bloke eden programlarla başa çıkmak |
| 68 | + |
| 69 | +En kolay ve kontrol edilebilir çözüm, `setTimeout` 'u fonksiyonun içinde |
| 70 | +kullanmaktır. |
| 71 | + |
| 72 | + function foo(){ |
| 73 | + // 1 saniye süren bir işlem |
| 74 | + setTimeout(foo, 100); |
| 75 | + } |
| 76 | + foo(); |
| 77 | + |
| 78 | +Bu örnekte hem `setTimeout` çağrısı fonksiyonun kendisi içinde kapsanmış olmakta, |
| 79 | +hem de fonksiyon çağrılarının istiflenmesinin önüne geçilerek daha fazla kontrol |
| 80 | +sağlanmaktadır. Artık `foo` fonksiyonunun kendisi tekrar çalışmak isteyip |
| 81 | +istemediğine karar verebilir. |
| 82 | + |
| 83 | +### Zamanlayıcıları iptal etmek |
| 84 | + |
| 85 | +Zamanlayıcıları iptal etmek için ilgili ID sayıları ile kullanılan zamanlatıcı |
| 86 | +fonksiyonuna karşılık gelen `clearTimeout` ve `clearInterval` fonksiyonlarından |
| 87 | +biri kullanılır. |
| 88 | + |
| 89 | + var id = setTimeout(foo, 1000); |
| 90 | + clearTimeout(id); |
| 91 | + |
| 92 | +### Tüm zamanlayıcıları iptal etmek |
| 93 | + |
| 94 | +Tüm zamanlayıcıları iptal etmenin dahili bir metod olmadığı için, bu amaca |
| 95 | +ancak kaba kuvvetle ulaşılabilir. |
| 96 | + |
| 97 | + // "tüm" zamanlayıcıları iptal et |
| 98 | + for(var i = 1; i < 1000; i++) { |
| 99 | + clearTimeout(i); |
| 100 | + } |
| 101 | + |
| 102 | +Bu rastgele seçilmiş sayıdan etkilenmeyen zamanlayıcılar kalabilir; bu yüzden |
| 103 | +tüm zamanlayıcı ID'lerinin saklanarak, teker teker iptal edilmeleri tavsiye |
| 104 | +olunur. |
| 105 | + |
| 106 | +### `eval` fonksiyonun gizli kullanımı |
| 107 | + |
| 108 | +`setTimeout` ve `setInterval` fonksiyonları ilk parametreleri olarak bir katar |
| 109 | +da kabul eder. Bu özellik **asla** kullanılmamalıdır, çünkü bu durumda dahili |
| 110 | +olarak `eval` kullanılır. |
| 111 | + |
| 112 | +> **Not:** Zamanlama fonksiyonları ECMAScript Standartında bulunmadığı için, |
| 113 | +> bir katar argümanı almaları durumundaki çalışma şekilleri JavaScript motorları |
| 114 | +> arasında farklılık gösterebilir. Gerçekten de, Microsoft'un JScript motoru |
| 115 | +> `eval` yerine `Function` oluşturucusunu kullanır. |
| 116 | +
|
| 117 | + function foo() { |
| 118 | + // setTimeOut ile bu fonksiyon çağrılacaktır |
| 119 | + } |
| 120 | + |
| 121 | + function bar() { |
| 122 | + function foo() { |
| 123 | + // bu fonksiyon çağrılmayacaktır |
| 124 | + } |
| 125 | + setTimeout('foo()', 1000); |
| 126 | + } |
| 127 | + bar(); |
| 128 | + |
| 129 | +Bu durumda `eval` [direkt olarak](#core.eval) çağrılmadığı için, `setTimeout` |
| 130 | +fonksiyonuna verilen katar *genel kapsamda* çalıştırılacaktır; bu nedenle, |
| 131 | +`bar` fonksiyonu kapsamındaki lokal `foo` değişkenini kullanmayacaktır. |
| 132 | + |
| 133 | +Zamanlama fonksiyonlarına verilen fonksiyona argüman sağlamak için de bir katar |
| 134 | +kullanılması tavsiye **edilmez**. |
| 135 | + |
| 136 | + function foo(a, b, c) {} |
| 137 | + |
| 138 | + // ASLA bu şekilde kullanılmamalı |
| 139 | + setTimeout('foo(1, 2, 3)', 1000) |
| 140 | + |
| 141 | + // Bunu yerine isimsiz bir fonksiyon kullanın |
| 142 | + setTimeout(function() { |
| 143 | + foo(a, b, c); |
| 144 | + }, 1000) |
| 145 | + |
| 146 | +> **Not:** `setTimeout(foo, 1000, a, b, c)` sentaksının kullanılması da mümkün |
| 147 | +> olmasına karşın tavsiye edilmez, çünkü bu kullanım [metodlarla](#function.this) |
| 148 | +> birlikte fark edilmesi zor hatalara neden olabilir. |
| 149 | +
|
| 150 | +### Sonuç |
| 151 | + |
| 152 | +`setTimeout` veya `setInterval` fonksiyonlarına **asla** bir katar parametre |
| 153 | +verilmemelidir. Bu kullanım **çok** kötü bir programa işaret eder. Çağrılan |
| 154 | +fonksiyona argümanlar verilmesinin gerektiği durumlarda gerçek çağrıyı içinde |
| 155 | +bulunduran bir *isimsiz fonksiyon* kullanılmalıdır. |
| 156 | + |
| 157 | +Ayrıca, `setInterval` fonksiyonu çalışan JavaScript programı tarafından bloke |
| 158 | +olmadığı için tercih edilmemelidir. |
| 159 | + |
| 160 | +[1]: http://en.wikipedia.org/wiki/Document_Object_Model |
| 161 | + |
0 commit comments