代码之家  ›  专栏  ›  技术社区  ›  Nick Heiner

javascript:为什么在这里使用匿名函数?

  •  8
  • Nick Heiner  · 技术社区  · 14 年前

    我浏览了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黑客吗?

    1 回复  |  直到 14 年前
        1
  •  12
  •   Christian C. Salvadó    14 年前

    他们只想在这段代码中实现递归:

        (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 属性引用当前正在执行的函数,如果删除匿名函数,它将引用封闭函数,我认为他们不想再次调用整个函数。