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ć?
Interesujące. Nigdy wcześniej nie widziałem używanego 'arguments.callee'. –
Można również nadać wyrażeniu funkcji identyfikator. W ECMAScript 5 jest to preferowana metoda. – ChaosPandion
@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