作用域
作用域决定了「变量在哪里可以被访问到」。JS 有三层:全局作用域(整个脚本可见)、函数作用域(函数内部声明的变量外部看不到)、块级作用域(let/const 只在 {} 内有效)。变量查找遵循作用域链:当前层找不到,就一层层向外层找,直到全局,再找不到就报错。
另一个重要概念是词法作用域(静态作用域):函数能访问哪些变量,由它书写时的位置决定,而不是由它在哪里被调用决定。函数定义在哪个作用域里,就能看到那个作用域及外层的变量。
好的习惯是尽量少用全局变量——全局变量谁都能改,代码一多就变成「牵一发动全身」的事故现场。把变量关进函数或块里,各管各的,程序才好维护。
本节要点作用域分全局、函数、块三级;变量沿作用域链向外查找;词法作用域看定义位置而非调用位置;少用全局变量。
JavaScript
let globalVar = '全局变量'; function outer() { let outerVar = 'outer 的局部变量'; function inner() { // 作用域链:inner 找不到就去 outer、再去找全局 console.log(globalVar, outerVar); } inner(); } outer(); // 块级作用域 { let blockVar = '块里的变量'; console.log(blockVar); } // console.log(blockVar); // 报错:出了块就访问不到 // 词法作用域:看定义位置,不看调用位置 const x = '外部 x'; function readX() { console.log(x); // 永远打印"外部 x" } function caller(fn) { const x = 'caller 内部 x'; // 即使调用处有同名变量也不影响 fn(); } caller(readX);
📚 推荐阅读
来自万象云档的免费在线书籍,点击封面直接阅读




