sli*_*kts 6 javascript debugging jquery expression function
以jQuery框架为例,如果你运行这样的代码:
$(document).ready(function init() { foo.bar(); });
Run Code Online (Sandbox Code Playgroud)
您在Firebug中获得的堆栈跟踪将如下所示:
init()
anonymous()
anonymous([function(), init(), function(), 4 more...], function(), Object name=args)
anonymous()
anonymous()
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它不是非常易读,因为您必须单击每个函数以找出它是什么.匿名函数也会(?)()在分析器中显示,并且它们可能导致" 无法访问优化闭包 "错误.在我看来,这些是避免它们的充分理由.然后有一个事实是ECMAScript 5将arguments.callee在其严格模式下弃用,这意味着它不可能用它来引用匿名函数,这使得它们在未来的证据不那么简单.
另一方面,使用命名函数可能会导致重复,例如:
var Foo = {
bar: function bar() {}
}
function Foo() {}
Foo.prototype.bar = function bar() {}
Run Code Online (Sandbox Code Playgroud)
我是否认为根据命名函数提供的调试方便,这种重复是正确的,并且jQuery等良好框架中匿名函数的流行是一种疏忽?
我在这篇内容丰富的文章中找到了我的问题的答案。首先,事实证明我关于命名函数更可取的观点是正确的,但解决方案并不像向所有匿名函数添加标识符那么简单。造成这种情况的主要原因是 JScript 以一种非常糟糕的方式实现函数表达式。
其次,函数语句和表达式之间有区别。匿名函数只是省略了标识符的函数表达式,添加标识符(命名它)不会使其成为语句(JScript 除外,这就是它被破坏的原因)。这意味着所有其他答案都没有意义。