JavaScript函数声明的作用域由词法作用域决定,即定义时确定可访问变量;全局声明的函数全脚本可用,函数内声明的仅限该函数体内调用,嵌套函数形成闭包并捕获外层变量引用。

JavaScript 函数声明的作用域由词法作用域决定,即函数在定义时就确定了它能访问哪些变量,而不是调用时才决定。
函数声明只在声明它的作用域内有效
函数声明(function name() { ... })不会被提升到全局作用域,仅在其所在的词法作用域中可访问:
- 在全局中声明的函数,可在整个脚本中调用
- 在函数内部声明的函数,只能在该函数体内调用,外部无法访问
- 嵌套函数可访问外层函数的所有变量、参数和函数声明,但外层不能访问内层声明的函数
嵌套函数形成闭包的关键基础
内层函数在定义时就捕获外层作用域的变量引用,即使外层函数执行结束,只要内层函数还被引用,外层变量就不会被回收:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 多个嵌套函数共享同一份外层变量实例
- 若外层使用 let 或 const 声明变量,每个循环迭代会创建独立绑定(如 for 循环中声明的函数)
- 用 var 声明的变量存在提升,但作用域仍限于所在函数,不会泄漏到全局
注意变量遮蔽与查找顺序
当内外层存在同名标识符时,JavaScript 按作用域链从内向外查找,内层声明会遮蔽外层同名变量:
立即学习“Java免费学习笔记(深入)”;
- 查找路径:当前作用域 → 外层函数作用域 → 全局作用域
- 函数参数、let/const/var 声明的变量、其他函数声明,都对内层可见
- 遮蔽不等于覆盖,外层变量依然存在,只是暂时不可见
块级作用域不影响函数声明的提升行为
ES6 引入了块级作用域({}),但函数声明在块内时行为较特殊:
- 在 if 或 for 块中声明函数,不同浏览器实现曾有差异;现代标准要求其具有块级作用域
- 推荐统一使用函数表达式(const fn = function() {})或箭头函数来避免兼容性问题
- let 和 const 声明的函数表达式严格遵循块级作用域规则

















