函数作用域在定义时就已确定,而非调用时;遵循词法作用域规则,变量查找按就近原则沿定义时形成的静态作用域链向上进行,嵌套函数由此产生闭包。

函数定义时作用域就已固定
函数的作用域不是在调用时才决定的,而是在它被写出来(定义)的那一刻就确定了。这叫词法作用域或静态作用域。比如一个函数写在全局里,它就能访问全局变量;如果写在另一个函数内部,它除了能访问自己的局部变量,还能向上一层层找外层函数和全局的变量——但这个“能找谁”,只看它在代码里嵌套的位置,跟怎么调用没关系。
执行时形成独立作用域,变量查找按就近原则
每次函数被调用,都会临时创建一个私有的作用域(也叫执行上下文)。在这个作用域里:
- 先进行预解释:声明的变量和函数名会被提前“挂起”,但赋值还没发生
- 再逐行执行代码:遇到变量,先在当前作用域找;找不到,就往定义时的外层作用域找,一级一级往上,直到全局;都找不到就报错
- 如果当前作用域有同名变量,就不会再去外层读取——这就是“就近覆盖”
形参、实参与 arguments 的作用域关系
函数的形参一进入执行阶段,就自动成为该函数作用域内的局部变量,和用 var 声明的效果类似。实参的值会赋给这些形参,完成初始化。同时,每个函数体内都能访问内置的 arguments 对象(伪数组),它保存所有传入的实参,也属于当前函数作用域,外部无法直接访问。
嵌套函数带来多层作用域链
当函数内部再定义函数(嵌套),内层函数的作用域不仅包含自身,还保留对外层函数作用域的引用。这意味着即使外层函数已经执行完毕、本该销毁,只要内层函数还存在(比如作为返回值被保存),外层的变量仍可被访问——这就是闭包的基础。作用域链在定义时生成,执行时沿链查找,不因外层函数退出而断裂。











