不会。函数声明提升不改变函数的作用域,作用域由定义位置静态决定;提升仅影响可调用时机,不移动作用域边界,也不使函数逃出原有作用域或变为全局函数。

不会。函数声明提升本身不改变函数的作用域。
函数的作用域由它被定义的位置决定,而不是由是否被提升决定。提升只是让函数在作用域内“提前可用”,但它的词法作用域(即能访问哪些变量、处于哪一层嵌套)完全取决于声明时所在的代码结构。
函数声明提升只影响可调用时机,不移动作用域边界
比如:
function outer() {
console.log(a); // undefined(var a 提升但未赋值)
function inner() { return a; }
var a = 123;
return inner();
}
inner 是在 outer 函数体内声明的,所以它的作用域链包含 outer 的局部环境和全局环境。即使 inner 被提升到 outer 顶部,它依然无法访问 outer 外部的私有变量(除非闭包),也不能访问 outer 内部尚未执行到的 let/const 变量(会掉进 TDZ)。
块级作用域中函数声明的特殊性
ES6 严格模式下,在 if、for 等块中写 function foo(){}:
- 不再被提升到外层函数或全局作用域
- 仅在该块内有效,且受暂时性死区约束(声明前访问报错)
- 这说明:提升行为受作用域规则制约,而不是反过来影响作用域
常见混淆点澄清
- ✅ 提升后函数仍只能访问其定义位置所处作用域中的变量
- ❌ 提升不会让函数“逃出”原本的作用域去读取外层或内层变量
- ❌ 提升不会使函数变成全局函数(除非它本就定义在全局)
关键结论
函数声明提升是编译阶段对声明位置的调整,而作用域是静态确定的嵌套关系。两者独立:一个管“什么时候能用”,一个管“能访问什么”。
本质上,提升发生在作用域已经确立之后——引擎先根据代码结构建立作用域链,再按规则处理提升。











