js 预解析

#### 预解析

- 在当前作用域下(函数作用域),js代码执行之前,浏览器会默认把var,function声明(匿名函数没有function声明,所以不会提升)的变量在内存中进行提前声明或定义.(未赋值,undefined)

- 变量提升,

  - 只提升声明,不提升赋值

  - 全局变量不进行预解析

```

var a=b=c=0;//a进行变量提升,b c为全局变量

```

- 函数提升

  - 函数声明 代表函数整体,函数提升后,函数名代表整个函数,但函数并没有被调用

```

fn();//f

function fn() { console.log('f'); }

```

  - 函数表达式 创建函数,会执行变量提升,函数体未提升。

```

fn();//报错, fn is not a function

var fn = function() { console.log('f'); }

```

##### 注

- es6中的class和let const一样都不存在变量提升,但是都有暂时性死区。
 
暂时性死区:
ES6 明确规定,如果区块中存在let和const命令(class),
这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。
凡是在声明之前就使用这些变量,就会报错。

 

 

https://blog.csdn.net/weixin_43887184/article/details/105512242

posted @ 2022-04-12 16:19  w0000  阅读(35)  评论(0编辑  收藏  举报