JavaScript fonksiyon bildirimi ve değerlendirilmesi amacıyla
Neden bu örnekler, ilk bir-ama diğerleri ne iş yapar?
// 1 - does not work
(function() {
setTimeout(someFunction1, 10);
var someFunction1 = function() { alert('here1'); };
})();
// 2
(function() {
setTimeout(someFunction2, 10);
function someFunction2() { alert('here2'); }
})();
// 3
(function() {
setTimeout(function() { someFunction3(); }, 10);
var someFunction3 = function() { alert('here3'); };
})();
// 4
(function() {
setTimeout(function() { someFunction4(); }, 10);
function someFunction4() { alert('here4'); }
})();
CEVAP
Bu ne kapanması bir sorun kapsamı bir sorun değildir. Sorun arasındaki anlayışbildirimleriveifadeler.
JavaScript kodu JavaScript daha Netscape'in ilk sürümü ve Microsoft ilk kopya bu yana, iki aşamada işlenir:
Aşama 1: derleme - bu aşamada kod sözdizimi ağacı (bayt veya ikili motora bağlı olarak) derlenir.
2. aşama: yürütme - ayrıştırılmış kod yorumlanır.
Fonksiyon sözdizimibeyannamesi:
function name (arguments) {code}
Bağımsız ders isteğe bağlı (isteğe bağlı kod ama bunu yapmanın ne anlamı var? gibi).
Ama JavaScript de fonksiyonlar oluştururifadeler. İşlev ifadeleri sözdizimi ifadesi bağlamında yazılmış olması dışında işlev tanımlamalar benzer. Ve ifadeler
=
işareti (veya nesne harfleri:
) sağında bir şey.- Parantez içinde bir şey
()
. - Fonksiyonları (aslında bu 2 zaten kaplıdır) parametreleri.
İfadeleraksinebildirimleriderleme aşamasından ziyade yürütme aşamasında işlenir. Ve bu ifadelerin sırası önemli.
Yani, açıklığa kavuşturmak için:
// 1
(function() {
setTimeout(someFunction, 10);
var someFunction = function() { alert('here1'); };
})();
Aşama 1: derleme. Derleyici someFunction
değişken oluşturur tanımlanan görür. Varsayılan olarak tüm değişkenleri tanımsız değeri var. Derleyici bu noktada değerleri atamak için bir değer döndürmek için bazı kod çalıştırmak için tercüman lazım, çünkü henüz değerleri atamak unutmayın. Ve bu aşamada henüz kod yürütme değiliz.
2. aşama: yürütme. Tercüman değişken someFunction
setTimeout geçirmek istediğiniz görür. Ve öyle de oldu. Ne yazık ki someFunction
geçerli değeri tanımsızdır.
// 2
(function() {
setTimeout(someFunction, 10);
function someFunction() { alert('here2'); }
})();
Aşama 1: derleme. Derleyici adı someFunction bir işlev bildirmek ve bunun yarattığı çok görür.
2. aşama: tercüman setTimeout someFunction
geçmek istediğiniz görür. Ve öyle de oldu. someFunction
geçerli değer derlenmiş fonksiyonu kabul edilir.
// 3
(function() {
setTimeout(function() { someFunction(); }, 10);
var someFunction = function() { alert('here3'); };
})();
Aşama 1: derleme. Derleyici değişken someFunction
bildirdikten ve yarattığı görür. Daha önce olduğu gibi, değeri tanımsızdır.
2. aşama: yürütme. Tercüman daha sonra yürütülecek setTimeout isimsiz bir işlev geçirir. Bu işlev değişken için bir kapatma oluşturur bu yüzden değişken someFunction
kullandığınız görüyor. Bu noktada someFunction
değeri hala tanımsızdır. someFunction
bir fonksiyon atama görür. Bu noktada someFunction
değeri artık tanımsızdır. SetTimeout bir saniye sonra 1/100 tetikler ve someFunction denir. Değeri artık tanımsız olduğu için çalışır.
Durum 4 gerçekten davanın başka bir sürüm 2 durum 3 biraz atılmış. Bu noktada someFunction
zaten bunun için dizayn edilmemiştir bildirilmiş setTimeout geçirilir.
Ek açıklama:
setTimeout(someFunction, 10)
someFunction yerel kopyasını ve bir setTimeout geçirildi arasında bir kapatma oluşturmak değil neden merak ediyor olabilirsiniz. Bunun cevabını JavaScript fonksiyonu argüman her zaman vardırher zamanher şey için referans ile, sayı veya dize varsa değeri geçti. Yani setTimeout değil aslında değişken someFunction geçti (hangi anlamına gelirdi kapatma olmak yaratılmış) değil de, sadece alır nesne someFunction ifade eder (bu durumda bir fonksiyon). Bu kırma kapama (döngüler örneğin) için JavaScript en yaygın olarak kullanılan mekanizma.
Çapraz tarayıcı masaüstü bildirimi içi...
Nasıl JavaScript arayan almak için fon...
Nasıl Javascript olmayan bir fonksiyon...
Fonksiyon adının önüne JavaScript artı...
Javascript: Fonksiyon Uzatmak...