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?
Interesante. Nunca he visto 'arguments.callee' usado antes. –
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
@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