💡
原文英文,约1800词,阅读约需7分钟。
📝
内容提要
在JavaScript中,提升是将变量和函数声明移动到作用域顶部的行为。var、let和const的提升方式不同:var初始化为undefined,而let和const在声明前不可访问。函数声明完全提升,函数表达式仅提升变量名。使用let和const可以避免提升相关错误,增强代码可预测性。
🎯
关键要点
- 提升是将变量和函数声明移动到作用域顶部的行为。
- var、let和const的提升方式不同:var初始化为undefined,而let和const在声明前不可访问。
- 函数声明完全提升,函数表达式仅提升变量名。
- 使用let和const可以避免提升相关错误,增强代码可预测性。
- 访问未声明的let变量会抛出ReferenceError,因为它在时间死区内。
- 函数声明可以在定义之前调用,因为整个函数被提升。
- 函数表达式在调用时会抛出TypeError,因为它们的赋值在提升后发生。
- 变量遮蔽会导致输出undefined,因为内部变量覆盖了外部变量。
- 函数声明优先于变量声明,导致函数可以在变量赋值之前被调用。
- 在同一作用域中重新声明var变量是允许的,最后的赋值会生效。
- 使用var的循环会导致意外输出,因为它是函数作用域的。
- var在函数的块作用域中被提升,而let和const遵循块作用域。
- 多个声明的输出取决于提升的顺序,最后的赋值会覆盖之前的声明。
- 立即调用函数表达式中的var会遮蔽外部变量,导致输出undefined。
- 箭头函数的提升依赖于变量声明,不像函数声明那样被提升。
- 避免提升相关错误的最佳实践包括使用let/const、在作用域顶部声明变量、在调用之前定义函数等。
❓
延伸问答
什么是提升,它如何影响变量和函数声明?
提升是JavaScript将变量和函数声明移动到作用域顶部的行为,只有声明被提升,而初始化保持在原位置。
var、let和const在提升方面有什么不同?
var会被初始化为undefined,而let和const在声明前不可访问,处于时间死区(TDZ)。
为什么访问未声明的let变量会抛出错误?
因为let变量在声明前处于时间死区(TDZ),访问时会抛出ReferenceError。
函数声明和函数表达式在提升时有什么区别?
函数声明会完全提升,可以在定义之前调用,而函数表达式仅提升变量名,调用时会抛出TypeError。
如何避免提升相关的错误?
使用let/const、在作用域顶部声明变量、在调用之前定义函数等最佳实践可以避免提升相关错误。
在同一作用域中重新声明var变量会发生什么?
重新声明var变量是允许的,最后的赋值会生效,不会抛出错误。
➡️