var声明的变量是否会被提升到IIFE外部?JS代码执行结果疑问
问题解答
首先先纠正你之前的错误逻辑:
- IIFE内部的
var variable_3声明只会被提升到当前IIFE函数作用域的顶部,完全不会影响全局作用域,所以你之前认为第一行variable_3 = 35是创建全局变量的认知是错误的。
核心错误原因说明
最后抛出ReferenceError的核心逻辑非常简单:全局作用域从头到尾都不存在variable_3这个变量,访问未声明的变量自然会报错。
下面是你疑惑的variable_3生命周期完整拆解:
- IIFE执行前的预编译阶段,会先扫描内部所有
var声明,把variable_3的声明提升到当前函数作用域最顶部,默认值为undefined,此时这个变量属于IIFE的局部变量,和全局完全无关 - 执行
variable_3 = 35时,赋值的是上面提到的局部变量,没有创建任何全局变量 - 后续的
var variable_3 = 45因为声明已经完成,只会给局部变量重新赋值为45 - IIFE执行结束后,内部的局部变量
variable_3会被直接回收销毁,全局根本访问不到这个变量 - 最后执行
console.log(variable_3)时,全局既没有显式声明variable_3,也没有隐式创建过这个变量,直接抛出引用错误。
另外补充你之前理解偏差的点:只有当赋值的变量在当前作用域以及所有上层作用域都找不到对应的声明时,才会隐式创建全局变量,你这里variable_3在当前IIFE作用域已经有提前提升的声明,所以永远不会变成全局变量。
内容的提问来源于stack exchange,提问作者PEIRAN LIU
相关产品推荐
相关产品推荐

