如果您不能通过您给出的名称来引用它们,那么命名函数表达式的重点是什么?

时间:2015-12-08 19:49:43

标签: javascript

如果你不能用你给他们的名字真正引用它们,那么命名函数表达式的重点是什么?

Project -> Open Recent

5 个答案:

答案 0 :(得分:11)

哦,但你可以用这个名字引用它们。这些名称仅存在于内部函数的范围内。

var f = function g() {
    // In here, you can use `g` (or `f`) to reference the function
    return typeof g;
};

console.log( typeof g );
// It only exists as `f` here
console.log( f() );

DOCS:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function#Named_function_expression

答案 1 :(得分:9)

我发现一个特别有用的优点是它在调试时有帮助。

发生错误时,您会在控制台的堆栈跟踪中看到函数名称。否则,堆栈跟踪中的行只会引用匿名函数。

您还可以通过为其命名来使函数的目的更清晰。

答案 2 :(得分:4)

如果你创建一个传递的递归函数,这很重要。当你命名一个函数时,它就会在自己的范围内知道自己。

这里我创建了一种创建递归函数的工厂函数。为了使递归函数正常工作,他们需要来了解自己。

您可以想象这在更广泛的意义上应用,例如将递归函数作为模块导出返回。

var 
func = (function () {
  return function rec (a) {
    console.log(a);
    return a >= 5 ? 'done' : rec(a + 1);
  };
}),
invoke = function (f, args) {
  return f.apply(null, args);
};

console.log(
  invoke(func(), [1])
);

答案 3 :(得分:1)

根据定义,您定义的不是匿名函数:

function [name]([param[, param[, ... param]]]) {
   statements
}

名称:

  

功能名称。可以省略,在这种情况下的功能   被称为匿名函数。

此外,很多人会考虑

var f = function() {
     return 'test';
 };

不是匿名函数,因为您现在可以通过var name f()调用它,现在可以通过名称functionThatTakesCallback(f)将函数作为参数传递给其他函数。

在我的脑海中,一个真正的匿名函数没有任何名称,例如传递给回调的东西:

$('#id').on('click', function(){
  console.log("I am anonymous");
});

或作为函数立即运行:

(function(when){
  console.log("run me :", when);
})("right now");

使用您现在使用的语法,在ES6(大多数非IE浏览器实现此功能)中,f.nameg。这在调试

时很有用

答案 4 :(得分:1)

你可以用它来重复:

var f = function g (n, m) {
    if (n>0) {
        return g(n - 1, m = m + 'meta');
    }
    return m + 'test';
};

console.log(f(10, 'super'));