2012-03-01 9 views
8

Bir mesaj uyarır basit işlevi olduğunu varsayalım. hatayı AtarBu kapatma neden çalışıyor? Öyle gibi çağırdığınızda</p> <pre><code>function callMessage(msg){ alert(msg); } </code></pre> <p>Şimdi, çalışmaz:

function sayHi(){ 
     var hey = "hi there" 
     setTimeout("callMessage(hey)", 1000); 
    } 
    sayHi(); 

"hey tanımlanmadı" Ama anonim işlevi içinde diyoruz ne zaman çalışır:

function sayHi(){ 
     var hey = "hi there" 
     setTimeout(function(){callMessage(hey);}, 1000); 
    } 
    sayHi(); 

neden bir içine koyduğunuzda sadece görünür "hey" değişkendir anonim işlev?

+1

değerlendirildiğinde alınamaz böylece ve (javascript Peşinde değişkeni kullanılır olacağını bilemez çünkü) ben de aynı bir fikstür kaydedilmez bunu dene; setTimeout ("var hey =" merhaba "; callMessage (hey)", 1000); – mindandmedia

+0

Senin yerinde olsaydım, bir şeyler okumuştum - http://www.digital-web.com/articles/scope_in_javascript/ –

cevap

14

İlk örnekte, kodundan sonra kod değerlendirilerek zamanlayıcının süresi doldu ve geçerli kapsam bırakıldı. O anda hey tanımsızdır.

İkinci örnek - setTimeout'u kullanmanın uygun yolu - setTimeout() çağrılırken oluşturulan anonim bir işlevi kullanır. Bu anonim işlev, geçerli kapsamın bir kopyasını da alır.

+0

İkinci örnekte, kapağın gövdesi o zamana kadar değerlendirilmez. – sepp2k

+2

Daha sonra * yürütülemez *. Birincisi * kelimenin tam anlamıyla * değerlendirilir ('eval()'). –

+0

Bu mantıklı. İsimsiz işlevlerin ana kapsamının bir kopyasını aldığını bilmiyordum – levi

6

"callMessage (hey)" bir dizgidir, kapanma değil. Zaman aşımı çalıştığında değerlendirilir ve bu noktada değişken hey kapsamda değildir.

3

normaldir.

İkinci örnek, fikstür dediğimiz şeyi yaratır, bu bir yürütme bağlamıdır. hey değişken değişkeni anonim işlev tarafından bellekte kullanılmak üzere kaydedilir. İlk örnekte

hey değişken dize

İlgili konular