2010-06-03 22 views
9

tanımlanan isimsiz bir işlevi: isimsiz bir işlevÇağrı Bu kodu yaptık bir setInterval

window.setInterval(function(){ var a = doStuff(); var b = a + 5; }, 60000) 

gerçek içeriği sadece önemli değil olarak bu küçük örnek tabii ki. Gerçekten gerçekleşen şey, fonksiyonun kendisinde bir dizi değişken yaratılır çünkü küresel alanı kirletmek istemiyorum/istemiyorum.

Ancak, hepinizin bildiği gibi, doStuff() işlevi sayfa 60 saniyeye kadar çağrılmayacak. Şu anda, sayfa yüklendiği anda ve her 60 saniyede de bu işlevi çağırmak istiyorum.

İç kodu kopyalayıp setInterval() satırının hemen arkasına yapıştırmadan işlevi çağırmak bir şekilde mümkün mü? Dediğim gibi, küresel alanı, fonksiyonun dışında ihtiyaç duyulmayan gereksiz değişkenlerle kirletmek istemiyorum.

+0

Aralık dışı işlevi oluşturun ve bir değişkene koyun. –

+1

Biliyorum, ama mümkünse kaçınmaya çalışıyorum. Aşağıdaki kod tamamen geçerli iken – Tominator

cevap

14

Bir değişkende sizin geri çağırma işlevi koymak ve kendi kendine çağırarak anonim işlevinde şeyi paketleyebilirim:

(function() { 
    var callback = function() { 
     var a = doStuff(); 
     var b = a + 5; 
    }; 

    callback(); 

    window.setInterval(callback, 60000); 
})(); 

yok kirliliği.

+3

+1, okumak için sinir bozucu olduğunu düşünüyorum. – Warty

+0

Cool, bu güzel çalışıyor! – Tominator

5

Bu durum genel değişkenleri yaratmadan mümkündür:

setInterval((function fn() { 
console.log('foo'); // Your code goes here 
return fn; 
})(), 5000); 

Aslında bu şekilde, hiç bir değişkenleri oluşturmayın. Ancak, Internet Explorer'da, fn işlevinin çevreleyen kapsamından (bir hata nedeniyle) erişilebilir hale gelmesi sağlanacaktır. bunun olmasına istemiyorsanız, sadece kendi kendine çağırarak anonim işlevinde şeyi sarın:

(function() { 
setInterval((function fn() { 
    console.log('foo'); // Your code goes here 
    return fn; 
})(), 5000); 
})(); 

Kredi Paul İrlandaca sharing this trick için.


Düzenleme: Biraz daha bilgilerle güncellenen Cevap, bobince sayesinde.

+0

Zeki! Neredeyse çok zeki :) – Miles

+0

hmm bu durumda anonim işlev bir kez çağrılır, ancak daha sonra setInterval işlevi "geçersiz argüman geçti" diyor. Muhtemelen çalıştırılan işlevin sonucunu almakta ve 5 saniyeden sonra (ki bu geçersizdir) yeniden çalıştırmayı denemektedir. – Tominator

+0

@ Tema: Bu olmamalı. Gönderdiğim kod snippet'i konsolumda düzgün çalışıyor. Lütfen kodunuzu gösteriniz. –

0

henüz başka çözüm: ilk defa çalıştırın ve sonra bir zaman aşımından sonra tekrar kendini var çalıştırmak böylece

(function() { 
    var a = doStuff(); 
    var b = a + 5; 
    window.setTimeout(arguments.callee, 60000); 
})(); 

Bu zaman aşımı yerine aralığını kullanır.