预解析详解——为什么var定义的变量,可以在定义之前使用?

1.什么是预解析?

浏览器在执行JS代码的时候会分成两部分操作:预计西以及逐行执行代码
也就是说浏览器不会直接执行代码,而是加工处理之后再执行
这个加工处理的过程,我们就称之为预解析

2.预解析规则

2.1、将变量声明函数声明提升到当前作用域最前面。只提升声明,不提升赋值/函数调用。

函数声明:包含{}内的代码片段,以下整体都是函数声明
function f() {
console.log(“鸽子”);
}

2.2、将剩余代码按照书写顺序一次放到后面(先提升var,在提升function。同名除外)

3.注意点:

  1. 通过let定义的变量不会被提升(不会被预解析)
  2. 在高级浏览器中,不会对{}中定义的函数进行提升(预解析)。代码顺序执行
  3. 只有在低级浏览器中,才会解析
  4. 如果变量名称和函数名称同名,那么函数的优先级高于变量。一定要记住,在企业开发中千万不要让变量名称和函数名称重名

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");
}

猜你喜欢

转载自blog.csdn.net/Cao_Mary/article/details/89456819
今日推荐