Skip to content

JS 变量提升

要点速览

shell
# 变量提升
JavaScript 执行代码分 2 步:编译阶段(创建作用域、提升),执行阶段(一行一行跑代码)
而在编译阶段会发生 变量/函数提升

# 提升原则
函数声明优先级 > var 变量声明
同名情况下,函数声明会覆盖变量提升
赋值(=)不会提升,只有声明会提升

拓展

shell
# 以下代码执行结果是 1
foo(); 
var foo; 
function foo(){console.log(1)}; 
foo=function(){console.log(2)} 

# 原因
编译阶段(提升规则),JS 会先扫描所有声明:
函数声明 function foo(){} 整体提升
变量声明 var foo 提升,但不赋值
提升后的真实结构是这样:

    # 先提升 函数声明(优先级最高)
    function foo(){console.log(1)}
    # 再提升 变量声明(发现 foo 已经存在,**不覆盖**)
    var foo; 
    # 然后才开始执行代码
    foo(); # 执行
    # 最后赋值
    foo = function(){console.log(2)}

提升完成后,foo 已经是 console.log(1) 这个函数
执行 foo() 输出 1
var foo 重复声明,无效
foo = ... 赋值是在调用之后,所以不影响前面的输出