1.什么是预解析?
浏览器在执行JS代码的时候会分成两部分操作:预计西以及逐行执行代码
也就是说浏览器不会直接执行代码,而是加工处理之后再执行
这个加工处理的过程,我们就称之为预解析
2.预解析规则
2.1、将变量声明和函数声明提升到当前作用域最前面。只提升声明,不提升赋值/函数调用。
函数声明:包含{}内的代码片段,以下整体都是函数声明
function f() {
console.log(“鸽子”);
}
2.2、将剩余代码按照书写顺序一次放到后面(先提升var,在提升function。同名除外)
3.注意点:
- 通过let定义的变量不会被提升(不会被预解析)
- 在高级浏览器中,不会对{}中定义的函数进行提升(预解析)。代码顺序执行
- 只有在低级浏览器中,才会解析
- 如果变量名称和函数名称同名,那么函数的优先级高于变量。一定要记住,在企业开发中千万不要让变量名称和函数名称重名
4.var同let定义的变量预解析
var定义的变量预解析:
//预解析之前:
console.log(num);//undefined
var num = 123;
//预解析之后:
var num;
console.log(num);
num = 123;
let定义的变量不会预解析:
console.log(num0);// num0 is not defined
let num0 = 456;
5.定义函数的方法及预解析
5.1、ES6之前定义函数的格式(三种)及预解析
//ES6之前的这种定义函数的格式,是会被预解析的,所以可以提前调用
f();
function f() {
console.log("鸽子");
}
//预解析之后的代码
function f() {
console.log("鸽子");
}
f();
5.2、如果将函数赋值给一个var定义的变量,那么函数不会被预解析,只有变量会被预解析
f1();//f1 is not a function
var f1 = function () {
console.log("gezi");
}
//预解析之后的代码
var f1;//undefined
f1();
f1 = function () {
console.log("gezi");
}
5.3、ES6定义函数的格式,不会被预解析.
f2();//f2 is not defined
let f2 = () =>{
console.log("gezi2");
}