作用域定义了变量的可见性或可访问性。在JavaScript中有三种作用域。全局作用域(Global Scope):一个在最外层定义的变量便处于全局作用域,全局作用域内的变量可以在程序的任意地方访问。函数作用域(局部作用域)(Function Scope):在函数内定义的变量则属于函数作用域,又称局部作用域。局部作用域内的变量只能在自身作用域内被访问。块作用域(Block Scope):ES6中引入了 let 与 const,与 var 不同的是。之前的例子中,在大括号(包括纯粹的大括号、if、while、for)间用 var 定义的变量处在全局作用域。如果我们用 let 与 const 在大括号中定义,变量将处于块作用域。块作用域内的变量只能在自身作用域内被访问。let 与 const 的不同点在于, const 定义的是一个常量,无法修改定义后的值。作用域链:当一个变量在当前作用域无法找到时,便会尝试寻找其外层的作用域,如果还找不到,再继续往外寻找(只会往外寻找,不会寻找兄弟作用域,更不会往内寻找)。这种如同链条一样的寻找规则便被称为作用域链。函数的作用域是它定义时的作用域,而不是调用时。如果找不到变量会怎样?在非严格模式下,尝试赋值一个变量时,如果找不到则会隐性声明成全局域的变量。非严格模式下,尝试使用一个变量的值时,如果找不到同样会报错。在严格模式下,不论赋值还是使用未事先声明的变量都会报错。作用域的好处在于写代码时不用区分全局使用域、局部作用域、块作用域的概念。只用记得大括号就是一个作用域,寻找变量永远是从内往外找。使用 let 命名变量,避免使用 var,以避免潜在的命名冲突。理解作用域和作用域链对于避免程序中的意外行为至关重要,尤其是在处理函数调用和变量引用时。正确使用作用域概念可以帮助提高代码的可读性和维护性。建议在日常编程中积极实践这些原则,并理解它们如何影响程序的执行。