Javascript 在对象中声明函数名,为什么?

Javascript 在对象中声明函数名,为什么?,javascript,Javascript,正在研究一些js代码性能,并看到了这种方法: window.sample = { foo: function foo(a,b){ // code goes here } bar: function bar(a,b){ // code goes here } } 有什么原因可以让函数名在“function”之后减速吗 调试有帮助吗 它是好的还是坏的,或者只是没有必要?它们不是为foo和bar属性分配匿名函数,而是分配命名函数 这对

正在研究一些js代码性能,并看到了这种方法:

window.sample = {

    foo: function foo(a,b){
       // code goes here
    }

    bar: function bar(a,b){
       // code goes here
    }

}
有什么原因可以让函数名在“function”之后减速吗

调试有帮助吗


它是好的还是坏的,或者只是没有必要?

它们不是为foo和bar属性分配匿名函数,而是分配命名函数


这对调试很有帮助:据我所知,唯一的区别在于,调用堆栈中会显示函数名,而不是“javascript匿名函数”

唯一的原因是您可以从函数内部使用函数本身,而无需引用对象:

foo: function foo(a,b){
   return a > 0 ? a + foo(a-1,b) : b;
}
但是请注意,对命名函数文本的支持在不同浏览器中并不一致,因此您应该真正避免使用它。

这是一个命名函数表达式。函数名只能作为函数本身的变量使用。这对于递归非常有用,例如:

var obj = {
    foo: function foo(node) {
        // Do something to node

        var childNode = node.firstChild;
        while (childNode) {
            foo(childNode);
            childNode = childNode.nextSibling;
        }
    }
};
大多数浏览器中也可以通过函数的非标准
name
属性使用函数名,这有助于在调试或检查堆栈跟踪时识别函数


IE<9有一个有缺陷的实现,所以在使用它时需要小心。有关详细信息,请访问。

@JosephDreamer哦,对了。(关于“代码性能”的上下文是一个令人费解的问题。)如果您使用console.log(示例),这还不够吗;那么?@我认为@jbabey的意思是在出错时跟踪堆栈。如果它没有名字,控制台会说类似于
匿名函数
,因为它没有名字。@Joseph啊,我明白了