Я просматривал код JIT, и я видел это:
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;
};
Какова могла быть цель для тех анонимных функций? Они сразу передают из объема, правильно?
Почему использование:
(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);
вместо:
ans.addNode(json);
for(var i=0, ch = json.children; i<ch.length; i++) {
ans.addAdjacence(json, ch[i]);
arguments.callee(ans, ch[i]);
}
Действительно ли это - некоторый супер элитный взлом JS?
Они просто хотят реализовать рекурсию в этом маленьком кусочке кода:
(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);
свойство arguments.callee
ссылается на текущую выполняющуюся функцию, если вы удалите анонимную функцию, она будет ссылаться на вложенную функцию, и я не думаю, что они хотят вызывать всю функцию снова.