【问题标题】:Javascript: Why use an anonymous function here?Javascript:为什么在这里使用匿名函数?
【发布时间】:2010-06-21 04:38:16
【问题描述】:

我在浏览 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 hack 吗?

【问题讨论】:

    标签: javascript anonymous-function


    【解决方案1】:

    他们只想在那一小段代码中实现递归:

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

    【讨论】:

    • 有趣。我以前从未见过arguments.callee
    • 你也可以给函数表达式一个标识符。在 ECMAScript 5 中,这是首选方法。
    • @Chaos,是的,是首选方式,在 strict modearguments.callee 在 ES5 上是不允许的...但是使用命名函数表达式 now 可能会导致问题,因为IE有一个严重的、长期存在的错误,其中函数表达式的标识符缺少封闭范围,实际上,创建了两个函数对象......这个错误甚至存在于IE9平台预览......悲伤......另见:Named function expressions demystified
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多