2013-08-26 9 views
6

Próbuję zbudować grę i zauważyłem, że dla organizacji lepiej jest umieścić niektóre funkcje w innych funkcjach, ponieważ są one używane wyłącznie w pierwotnej funkcji. Na przykład:Które z funkcji JavaScript jest lepsze?

function fn1() 
{ 
    fn2(); 

    function fn2() 
    { 
     //Stuff happens here 
    } 
} 

fn1 jest wywoływana wiele razy, i fn1 wezwie fn2 kilkakrotnie w jego realizacji. Kiedy wywoływana jest fn1, czy za każdym razem trzeba ponownie przetworzyć (z braku lepszego słowa) fn2? Czy z tego powodu tracę wydajność? Czy zamiast tego powinienem wstawić fn2 po fn1?

function fn1() 
{ 
    fn2(); 
} 

function fn2() 
{ 
    //Stuff happens here 
} 

Odpowiedz

2

Można to zrobić, aby osiągnąć podobny scopingu, ale tylko utworzyć jedną kopię fn2:

//Initiliaze before you call `fn1`: 
var fn1 = (function(){ 

    // This is the function assigned to fn1 
    return function(){ 
     fn2(); 
    } 

    function fn2() 
    { 
     //Stuff happens here 
    } 
})(); 

porównać wyjścia konsoli z nich do skrzypiec, które były tworzy dodatkową kopię fn2 , ponieważ lokalnie scoped fn2 jest tworzony dla każdego wezwania do fn1: http://jsfiddle.net/A2UvC/3/ i http://jsfiddle.net/A2UvC/3/

są zalety do additiona l copys z fn2 jednak. Mogą mieć dostęp do różnych zmiennych, takich jak w następującej sytuacji:

function fn1(x){ 

    // Return an object exposing fn2 to the caller's scope 
    return {fn2: fn2}; 

    // Each call to fn1 creates a new fn2 which has access 
    // to the closured `x` from the call to fn1 that created it 
    function fn2(){ 
     console.log(x); 
    } 

} 

var ex1 = fn1(1); 
var ex2 = fn1(2); 

ex1.fn2 == ex1.fn2; // true 
ex1.fn2 == ex2.fn2; // false, because they are two distinct copies 

ex1.fn2(); // 1 
ex2.fn2(); // 2 
ex2.fn2(); // 2 
ex1.fn2(); // 1 
+0

Ponieważ nie zamykasz wyrażenia funkcji w nawiasach, może chcesz wyraźnie wskazać, że wywołujesz funkcję zewnętrzną od razu. Odpowiedni materiał do czytania: http://benalman.com/news/2010/11/immediately-invoked-function-expression/. –

+1

@FelixKling Dodałem nawias, aby uczynić to bardziej oczywistym. – Paulpro

+1

+1 :-) Czy możesz wyjaśnić, czy pierwszy sposób OP tworzy wiele kopii fn2 –