作用域是变量的访问边界:函数内声明的变量出函数即失效,let/const在{}内才有效,未声明赋值则自动挂全局;分全局、函数、块级三类,依声明方式和位置而定;变量查找按作用域链从当前作用域逐层向外,找不到即报referenceerror。

直接说清本质,不绕概念,面试官要听的是你理解得准、讲得稳、能落地。核心就三点:作用域是什么、怎么分、变量怎么找。
作用域就是变量的“地盘”
不是抽象术语,是实实在在的访问边界——变量在哪能用、在哪不能用。比如:
- 函数内部用 var/let/const 声明的变量,出了函数就找不到;
- if 或 for 里用 let 声明的变量,只在那对花括号里有效;
-
没加声明直接赋值的变量(如
a = 123),自动挂到全局对象上(浏览器是window.a),哪都能访问——但这是坏习惯,要避免。
作用域分三类,关键看“怎么声明”和“在哪声明”
不用背名词,按声明方式来记更牢:
-
全局作用域:脚本顶层写的、或隐式挂在
window/globalThis上的; -
函数作用域:只要函数一定义,它内部就形成一个独立作用域,
var受它管; -
块级作用域:ES6 起,
let和const在{}内创建,if、for、try里都算,var不买账。
变量查找靠“作用域链”,规则就一条:从近到远
执行一个函数时,JS 引擎会把当前作用域 + 所有外层作用域串成一条链,查找变量时:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 先查自己作用域里有没有;
- 没有就往上一级(父函数)找;
- 再没有就继续往上,直到全局;
- 全程找不到,就报
ReferenceError。
注意:内层能读外层的变量,外层绝不能读内层的——这不是权限问题,是作用域链单向性决定的。
闭包其实是作用域链的“保鲜袋”
如果被问到闭包,一句话带过本质即可:
函数返回了内部函数,而这个内部函数还用着外层函数的变量——那些变量不会被回收,因为作用域链被保留下来了。比如计数器、私有状态、防抖函数里的定时器引用,都靠它。










