2010-06-21 17 views
8

Przeglądam właśnie kod JIT, a ja zobaczyłem to:Javascript: Dlaczego warto korzystać z anonimowej funkcji?

var isGraph = ($type(json) == 'array'); 
    var ans = new Graph(this.graphOptions); 
    if(!isGraph) 
     //make tree 
     (function (ans, json) { 
      ans.addNode(json); 
      for(var i=0, ch = json.children; i<ch.length; i++) { 
       ans.addAdjacence(json, ch[i]); 
       arguments.callee(ans, ch[i]); 
      } 
     })(ans, json); 
    else 
     //make graph 
     (function (ans, json) { 
      var getNode = function(id) { 
       for(var w=0; w<json.length; w++) { 
        if(json[w].id == id) { 
        return json[w]; 
        } 
       } 
       return undefined; 
      }; 

Co może być celem dla tych anonimowych funkcji? Natychmiast tracą zasięg, prawda?

Dlaczego zastosowanie:

 (function (ans, json) { 
      ans.addNode(json); 
      for(var i=0, ch = json.children; i<ch.length; i++) { 
       ans.addAdjacence(json, ch[i]); 
       arguments.callee(ans, ch[i]); 
      } 
     })(ans, json); 

zamiast:

  ans.addNode(json); 
      for(var i=0, ch = json.children; i<ch.length; i++) { 
       ans.addAdjacence(json, ch[i]); 
       arguments.callee(ans, ch[i]); 
      } 

Jest to niektóre bardzo elitarne JS włamać?

Odpowiedz

12

Oni po prostu chcą wprowadzić rekursji w tym małym kawałku kodu:

(function (ans, json) { 
     ans.addNode(json); 
     for(var i=0, ch = json.children; i<ch.length; i++) { 
      ans.addAdjacence(json, ch[i]); 
      arguments.callee(ans, ch[i]); // <-- recursion! 
     } 
    })(ans, json); 

Obiekt arguments.callee odnosi się do aktualnie wykonywaną funkcję, jeśli usunąć funkcję anonimową, będzie odnosić się do funkcji otaczającego, i Nie sądzę, że chcą ponownie wywołać całą funkcję.

+1

Interesujące. Nigdy wcześniej nie widziałem używanego 'arguments.callee'. –

+1

Można również nadać wyrażeniu funkcji identyfikator. W ECMAScript 5 jest to preferowana metoda. – ChaosPandion

+2

@Chaos, Tak, jest preferowanym sposobem, w [trybie ścisłym] (http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/) 'arguments.callee' jest zabronione ES5 ... ale używanie nazwanych wyrażeń funkcyjnych * teraz * może powodować problemy, ponieważ IE ma poważny, długotrwały błąd, w którym w istocie tworzone są dwa obiekty funkcyjne, w których identyfikator wyrażeń funkcyjnych, nie mieszczący się w otaczającym zakresie, jest ... Ten błąd istnieje nawet w IE9 Platform Preview ... Sad ... Zobacz też: [Wywoływane nazwane wyrażenia funkcji] (http://yura.thinkweb2.com/named-function-expressions/) – CMS

Powiązane problemy