SORU
8 EKİM 2010, Cuma


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
8 EKİM 2010, Cuma


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

  1. = işareti (veya nesne harfleri :) sağında bir şey.
  2. Parantez içinde bir şey ().
  3. 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Cole Rolland

    Cole Rolland

    23 Kasım 2008
  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007
  • Project Mooncircle

    Project Moon

    6 Aralık 2009