使用setTimeout调用箭头函数报错,改用普通函数正常,原因及解决方法?
问题原因分析
普通函数声明(比如function bye() { console.log('Goodbye') })会被变量提升到当前作用域的最顶部。也就是说,不管你把函数写在代码的哪个位置,JS解析器都会先把函数声明加载到内存里,所以调用setTimeout(bye, 3000)时,bye已经是一个可用的函数了。
但你用let声明的箭头函数本质是变量赋值操作——let bye只是声明了变量,箭头函数是后续赋值给它的。而let/const声明的变量存在「暂时性死区」:在变量声明语句之前的代码区域,变量无法被访问,哪怕是提前引用也会触发报错。你这里setTimeout调用在let bye = ...之前,正好落在了暂时性死区里,所以抛出Cannot access 'bye' before initialization的错误。
箭头函数的修复方案
有两种简单的解决方式:
- 把箭头函数的声明移到调用语句之前,让变量初始化后再被引用:
let bye = () => console.log('Goodbye'); setTimeout(bye, 3000); console.log('Hello');
- 直接把箭头函数作为参数传入
setTimeout,不用提前声明变量:
setTimeout(() => console.log('Goodbye'), 3000); console.log('Hello');
内容的提问来源于stack exchange,提问作者yoyocharlie
相关产品推荐
相关产品推荐

