如果你不能用你给他们的名字真正引用它们,那么命名函数表达式的重点是什么?
Project -> Open Recent
答案 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() );
答案 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.name
为g
。这在调试
答案 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'));