知识卡片
函数级作用域
内容
var 声明的变量是函数作用域非块级作用域:花括号代码块在语法上像会创建作用域(源自C),但 var 变量在整个函数内可见,不受块边界限制。因此”用到时才声明”在 var 代码里是坏习惯,应在函数开头统一声明。let/const/class 是真正的块级作用域,此陷阱只对 var 成立。发散:声明位置若让人误以为只在块内有效,会制造隐藏耦合。
参考来源
- 位置:《JavaScript语言精粹(修订版)》附录A《毒瘤 Awful Parts》"作用域"一节
- 结论依据:原文明确说"JavaScript采用了这样的块语法,却没有提供块级作用域:代码块中声明的变量在包含此代码块的函数的任何位置都是可见的",并因此建议在函数开头统一声明所有变量;据此保留原判断,同时按 MDN 块语句文档把结论精确限定为 var(函数作用域),并说明 let/const/class 是块级作用域。
- 原始内容:JavaScript采用了这样的块语法,却没有提供块级作用域:代码块中声明的变量在包含此代码块的函数的任何位置都是可见的……更好的方式是在每个函数的开头部分声明所有变量。