代码之家  ›  专栏  ›  技术社区  ›  slikts

JavaScript中的命名函数是否被低估了?

  •  6
  • slikts  · 技术社区  · 16 年前

    $(document).ready(function init() { foo.bar(); });
    

    Firebug中的堆栈跟踪如下所示:

    init()
    anonymous()
    anonymous([function(), init(), function(), 4 more...], function(), Object name=args)
    anonymous()
    anonymous()
    

    正如您所看到的,它的可读性不强,因为您必须单击每个函数才能找到它是什么。匿名函数也将显示为 (?)() 在探查器中,它们可以导致“ cannot access optimized closure “bug。在我看来,这些都是避免它们的好理由。然后,事实上ECMAScript 5将不推荐使用 arguments.callee

    var Foo = {
        bar: function bar() {}
    }
    
    function Foo() {}
    
    Foo.prototype.bar = function bar() {}
    

    考虑到命名函数提供的调试便利性,我认为这种重复是合理的,并且像jQuery这样的好框架中匿名函数的流行是一种疏忽,我这样认为对吗?

    4 回复  |  直到 16 年前
        1
  •  3
  •   C. Ross trotttrotttrott    16 年前

    我同意在JavaScript/EMCAScript中使用匿名方法有某些缺点。但是,不要忽视它们应该如何使用。对于要传递给另一个函数的简单的一行程序,它们通常是非常优秀的。

        2
  •  3
  •   slikts    16 年前

    我在这本书中找到了我问题的答案 very informative article

    其次,函数语句和表达式之间有区别。匿名函数只是一个省略了标识符的函数表达式,添加标识符(命名它)不会使其成为一个语句(JScript除外,这就是它被破坏的原因)。这意味着所有其他答案都不符合要求。

        3
  •  1
  •   Victor    16 年前

        4
  •  0
  •   August Lilleaas    16 年前

    匿名函数非常方便。如果firebug告诉您匿名函数是在哪一行的哪个文件中创建的,则可以更好地解决此问题,而不是命名函数。

    init()
    anonymous() // application.js, line 54
    anonymous() // foo.js, line 2
    

    堆栈跟踪是唯一存在匿名函数问题的地方。