繁体   English   中英

在javascript中的函数声明中命名函数的好处是什么?

[英]What is the benefit of naming a function in a function declaration in javascript?

我有时看到这种模式

function foo() {
    this.bar = function bar() {
        // code
    }
}

给函数命名而不是将其作为匿名函数的好处/原因是什么?

为了进一步说明/澄清:

function foo() {
    this.bar = function bar() {
        bar.someVar = 1;
    }
}

VS

function foo() {
    this.bar = function() {
        this.someVar = 1;
    }
}

谢谢

我想从根本上来说,您可以用一个问题来回答您的问题。 问题是,如果不命名该函数,将如何在其他位置显式调用该函数?

当然,您提供的示例在没有名称的情况下仍然可以使用,因此我建议,与开发人员的个人喜好和所有功能有关的事情一样多。 我个人喜欢为函数命名,以便于调试,重用和可读性以及显式调用它们的有用性。

通过一次创建函数并重新使用它们,还可以获得明显的性能优势。

命名function的主要好处是允许它是自引用的 ,尤其是对于递归而言:

如果要引用函数体内的当前函数,则需要创建一个命名函数表达式。 这样,该名称仅在功能主体(作用域)中是局部的。 这也避免了使用非标准的arguments.callee属性。

 var math = { 'factorial': function factorial(n) { if (n <= 1) return 1; return n * factorial(n - 1); } }; 

也就是说,无需知道其持有对象和引用属性名称即可更改:

// a contrived and hopefully unrealistic example

function foo() {
    this.bar = function () {
        return this.bar;
    };
}

console.log(new foo().bar());        // Function
console.log(new foo().bar.call({})); // undefined, `{}` doesn't have a `bar`

如前所述,这是对arguments.callee的部分“ 取缔 ”的可用解决方案:

注意 :应避免使用arguments.callee()而应为每个函数(表达式)命名。

警告 :ECMAScript的第五版禁止在严格模式下使用arguments.callee()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM