2010-06-21 12 views
8

estaba navegando el código del JIT, y vi esto:Javascript: ¿Por qué usar una función anónima aquí?

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; 
      }; 

Cuál podría ser el propósito de esas funciones anónimas? Inmediatamente pasan fuera del alcance, ¿verdad?

¿Por qué utilizar:

 (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); 

en lugar de:

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

Es esto algunos JS súper élite piratear?

Respuesta

12

lo que quieren es poner en práctica la recursividad en ese pequeño trozo de código:

(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); 

La propiedad arguments.callee se refiere a la función que se está ejecutando, si se quita la función anónima, se referirá a la función de cerramiento, y No creo que quieran invocar toda la función de nuevo.

+1

Interesante. Nunca he visto 'arguments.callee' usado antes. –

+1

También podría darle a la expresión de la función un identificador. En ECMAScript 5 este es el método preferido. – ChaosPandion

+2

@Chaos, sí, es la forma preferida, en [modo estricto] (http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/) 'arguments.callee' no está permitido en ES5 ... pero el uso de expresiones de funciones nombradas * ahora * puede causar problemas, porque IE tiene un error serio, de larga data, donde el identificador de expresiones de funciones, carece del ámbito adjunto, en realidad, se crean dos objetos de funciones ... Este error incluso existe en la Vista previa de plataforma IE9 ... Triste ... Ver también: [Desmistificación de funciones nombradas desmitificadas] (http://yura.thinkweb2.com/named-function-expressions/) – CMS

Cuestiones relacionadas