JavaScript 词条目录
前端Wiki/JavaScript/基础/函数

作用域

作用域决定了「变量在哪里可以被访问到」。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);
🔗 相关词条constletJS函数