2012-01-11 12 views
5

Chcę rozpowszechniać mój kod jako anonimowe funkcje samozwańcze, jak widzę wielu. Ponadto w moim kodzie muszę monitorować inne ładowanie lib, więc mogę go używać, gdy jest dostępny.setTimeout() na funkcji rekursywnej w ramach funkcji self invoking

(function(window, document, undefined) { 
    staffHappens(); 
    var initMyLib = function() { 
    if (typeof(myLib) == 'undefined') { 
     setTimeout("initMyLib()", 50); 
    } else { 
     useMyLib(); 
    } 
    } 
    moreStaffHappens(); 
    initMyLib(); //-> initMyLib is undefined 
})(this, document); 

Jak ten błąd może wystąpić? Czy initMyLib powinien znajdować się w zasięgu funkcji zamykającej (samozatrującej się)?

Odpowiedz

11

zmiana setTimeout("initMyLib()", 50); do setTimeout(initMyLib, 50);

Po przejechaniu ciąg jako argument będzie starał się ocenić go, gdy limit czasu jest zwolniony, ale to będzie działać w zakresie globalnym. A twoja metoda nie istnieje w zasięgu globalnym.


Demo nahttp://jsfiddle.net/gaby/zVr7L/

+0

Nie powinno to wpłynąć na miejsce, w którym jest "niezdefiniowane" chociaż ... – Ktash

+0

@kTash, nie powinno, ale czy jesteś pewien, że część "niezdefiniowana" pochodzi z tej linii, a nie z wykonania skrypt timeout? –

+0

Nie wiem. To jest linia, którą oświadczył, że się pojawił, więc domyślam się, że skończył debugowanie, aby dowiedzieć się, że tak wiele ... To była pierwsza rzecz, o której myślałem, ale jeśli zdarza się to w określonej linii, a nie w timeoutie, to nie jestem pewien, czy to prawda. Po prostu myślałem głośno – Ktash

1

Można również użyć prawdziwego funkcję anonimową, aby uniknąć określania zakresu zagadnień:

(function() { 
    if(typeof(myLib) == 'undefined') 
     setTimeout(arguments.callee, 50); 
    else 
     // loaded 
})() 
+1

Prawidłowe rozwiązanie, ale ponieważ 'arguments.callee' jest przestarzałe w ostatnich wersjach javascript, powinieneś go unikać i używać sugerowanego, który nazywa się funkcjami. Można to również zrobić za pomocą' (function name() {', a następnie użyj' setTimeout (name, 50); ' –

+0

@Gaby aka G. Petrioli: Wiem, ale" callee "to schludna funkcja, o której warto wiedzieć .. – georg

+0

to rzeczywiście ... –

2

Spróbuj przeczytać tę odpowiedź do kilku wskazówek: recursive function vs setInterval vs setTimeout javascript

ten jest próbką kodu z tej odpowiedzi:

/* 
this will obviously crash... and all recursion is at risk of running out of call stack and breaking your page... 

function recursion(c){ 
    c = c || 0; 
    console.log(c++); 
    recursion(c); 
} 
recursion(); 

*/ 

// add a setTimeout to reset the call stack and it will run "forever" without breaking your page! 
// use chrome's heap snapshot tool to prove it to yourself. :) 

function recursion(c){ 
    setTimeout(function(c){ 
     c = c || 0; 
     console.log(c++); 
     recursion(c); 
    },0,c); 
} 

recursion(); 

// another approach is to use event handlers, but that ultimately uses more code and more resources 
Powiązane problemy