js-预解析&变量提升

359 阅读3分钟

这是我参与2022首次更文挑战的第17天,活动详情查看:2022第一次更文挑战

  • JavaScript解析器
  • 预解析 (预解析概念、预解析做什么事、预解析的注意事项)
  • 变量提升和函数提升

JavaScript解析器

1.找一些东西:var、 function、 参数、a=未定义 (也被称之为预解析)。所有变量,在正式运行代码之前,都提前赋一个值:未定义undefined fn1=function fn1(){alert(2);} //所有的函数,在正式运行代码之前都是整个函数块

注:只先找var ,function声明的

遇到变量和函数重名了,只留下函数
遇到函数重名了,根据代码的上下文顺序,留下最后一个,变量也是一样

2.逐行解读代码

备注:表达式可以修改预解析的值

JS解析器在执行第一步预解析的时候,会从代码的开始搜索直到结尾,只去查找var、function和参数等内容。一般把第一步称之为“JavaScript的预解析”。而且,当找到这些内容时,所有的变量,在正式运行代码之前,都提前赋了一个值:未定义;所有的函数,在正式运行代码之前,都是整个函数块。

console.log(a);
var a=1;
console.log(a);
function a(){console.log(2);}
console.log(a);
var a=3;
console.log(a);
function a(){console.log(4);}
console.log(a);

具体过程:

1.找到第一个var存值为undefined(注意不会为其赋值为1,而是undefined2.function a(){console.log(2);}代替前面var
3.var =3不会替代function
4.function a(){console.log(4);}替代function a(){console.log(2);}
5.预解析结果:把a=function a(){console.log(4);}存在预解析的仓库里面

预解析

预解析概念

预解析就是在解析代码之前,提前解析代码。

预解析做什么事?

把变量的声明提前了----提前到当前所在的作用域的最上面
函数的声明也会被提前---提前到当前所在的作用域的最上面

预解析的注意事项

预解析中,变量的提升,只会在当前的作用域中提升,提前到当前的作用域的最上面
函数中的变量只会提前到函数的作用域中的最前面,不会出去
预解析会分段(多对的script标签中函数重名,预解析的时候不会冲突)
​
<script>
function f1() {
  console.log("哈哈");
}
</script>
 
<script>
    f1();
    function f1() {
      console.log("嘎嘎");
    }
</script>

变量提升和函数提升

变量使用的时候,把会变量的声明提升到作用域的上面。函数调用的时候,把会函数的声明提升到作用域的上面。

变量提升 提升的只是定义,赋值不会被提升。函数提升也是提升的只是定义,赋值不会被提升。

案例1 函数和变量 变量提升

f1();//调用
var num=20;//这个变量的声明会提升到变量使用之前
function f1() {
    console.log(num);//undefined
}
 
// 解析
var num;
function f1() {
    console.log(num);//undefined
}
f1();//调用
num=20;//这个变量的声明会提升到变量使用之前

案例2 函数和变量 变量提升

f1();//调用
var num=20;//这个变量的声明会提升到变量使用之前
function f1() {
    console.log(num);//undefined
    var num=10;
}
 
//解析
var num;
function f1() {
    var num;
    console.log(num);//undefined
    num=10;
}
f1();//调用
num=20;//这个变量的声明会提升到变量使用之前