3.3.1 匿名和具名
对于函数表达式你最熟悉的场景可能就是回调参数了,比如:
setTimeout( function() {
console.log("I waited 1 second!");
}, 1000 );
这叫作匿名函数表达式,因为function()..
没有名称标识符。函数表达式可以是匿名的,
而函数声明则不可以省略函数名——在JavaScript
的语法中这是非法的。
匿名函数表达式书写起来简单快捷,很多库和工具也倾向鼓励使用这种风格的代码。但是
它也有几个缺点需要考虑。
- 匿名函数在栈追踪中不会显示出有意义的函数名,使得调试很困难。28 | 第 3 章
- 如果没有函数名,当函数需要引用自身时只能使用已经过期的
arguments.callee
引用,
比如在递归中。另一个函数需要引用自身的例子,是在事件触发后事件监听器需要解绑
自身。 - 匿名函数省略了对于代码可读性 / 可理解性很重要的函数名。一个描述性的名称可以让
代码不言自明。
行内函数表达式非常强大且有用——匿名和具名之间的区别并不会对这点有任何影响。给函
数表达式指定一个函数名可以有效解决以上问题。始终给函数表达式命名是一个最佳实践:
setTimeout( function timeoutHandler() { // <-- 快看,我有名字了!
console.log( "I waited 1 second!" );
}, 1000 );