Javascript 什么';如果可以';我真的不能用你给他们起的名字来指代他们吗?

Javascript 什么';如果可以';我真的不能用你给他们起的名字来指代他们吗?,javascript,Javascript,如果你不能用你给的名字来引用函数表达式,那么命名函数表达式又有什么意义呢 var f = function g() { console.log("test"); }; g(); // ReferenceError: g is not defined 我发现特别有用的一个优点是,它在调试时很有帮助 发生错误时,您会在控制台的stacktrace中看到函数名。否则stacktrace中的行将只引用匿名函数 你也可以给函数起一个名字,让它的用途更清楚。哦,但是你可以用这个名字来引用它们。这

如果你不能用你给的名字来引用函数表达式,那么命名函数表达式又有什么意义呢

var f = function g() {
    console.log("test");
};

g(); // ReferenceError: g is not defined

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

发生错误时,您会在控制台的stacktrace中看到函数名。否则stacktrace中的行将只引用匿名函数

你也可以给函数起一个名字,让它的用途更清楚。

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

var f=函数g(){
//在这里,您可以使用'g'(或'f')引用函数
返回类型g;
};
控制台日志(g型);
//它在这里只作为'f'存在

console.log(f())如果创建一个传递的递归函数,这一点很重要。当你命名一个函数时,它就会在自己的范围内了解自己

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

您可以想象这在更广泛的意义上应用,就像返回一个递归函数作为模块导出一样

var
func=(函数(){
返回函数rec(a){
控制台日志(a);
返回a>=5“完成”:rec(a+1);
};
}),
invoke=函数(f,args){
返回f.apply(null,args);
};
console.log(
调用(func(),[1])

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

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

函数名。可以省略,在这种情况下,函数 成为一个匿名函数

另外,很多人都会考虑

var f = function() {
     return 'test';
 };
不是匿名函数,因为您现在可以通过var name
f()
调用它,并且现在可以通过name
函数将函数作为参数传递给其他函数,该函数采用scallback(f)

在我看来,真正的匿名函数没有任何名称,例如传递给回调的某个名称:

$('#id').on('click', function(){
  console.log("I am anonymous");
});
或作为一项功能立即运行:

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

按照您现在使用的语法,在ES6(大多数非IE浏览器实现此功能)中,
f.name
g
。这在调试时非常有用,您可以使用它来重现:

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

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

这个函数不是像
f()
那样可以调用吗?我知道我在这里有点挑剔,但如果它被命名,它就不是匿名函数。它们是相反的。在我的帖子中,我从来没有说过函数可以同时是匿名函数和命名函数。@trex005如果你想提供帮助和挑剔,你可以说给出的示例名为a:p你能详细说明一下吗,这样就不会更像是一个注释了?完成了。然而,我认为在这方面没有更多的细节需要阐述。无论如何,我认为这应该是答案的一部分。在这个特定的例子中,当函数分配给一个变量时,如果省略
g
,函数名将被推断为
f
。但是我知道它在其他情况下会很有用。你是对的,我没有真正注意这个例子。请注意,其中一个原因是使用
f
引用这里的函数是危险的-例如,可以在函数表达式之后将
f
重新定义为
null
,然后尝试调用
f()
在函数中会抛出。