作用域链和预解析机制
日期:2020-12-16
浏览:
87 评论:0
核心提示:作用域链什么是作用域从script标签内的声明的变量和函数都是0级作用域只要函数才能开辟作用域所以声明在0级作用域的函数开辟的一个作用域是1级作用域在1级作用域再声明一个函数就会开辟又一个作用域是2级作用域,依次类推作用域链变量的访问规则就是,自己的作用域里声明这个变量就用这个变量,没有就向上一级的作用域里找 ,一直找到0级作用域,找不到就会报错每一个作用域向链条一样连接起来,就叫作用域链预解析机制在执行代码前为了,代码运行的速率提高,在代码的执行前浏览器会预解析代码会在内存中
作用域链
什么是作用域
- 从script标签内的声明的变量和函数都是0级作用域
- 只要函数才能开辟作用域
- 所以声明在0级作用域的函数开辟的一个作用域是1级作用域
- 在1级作用域再声明一个函数就会开辟又一个作用域是2级作用域,依次类推
作用域链
- 变量的访问规则就是,自己的作用域里声明这个变量就用这个变量,没有就向上一级的作用域里找 ,一直找到0级作用域,找不到就会报错
- 每一个作用域向链条一样连接起来,就叫作用域链
预解析机制
- 在执行代码前为了,代码运行的速率提高,在代码的执行前浏览器会预解析代码会在内存中开辟好变量和函数的空间,执行代码时就赋值给变量就行了。
- 除了开辟变量和函数的空间,还有一个过程就是变量提升
变量提升
- 就是把所有var声明的变量和function关键字声明的函数,都会提升到他所在作用域的顶端,然后赋值语句留在原来位置
let和var的比较
- 相同点:
都是用来声明变量的
- 不同点:
1.var在0级作用域里声明的变量是window的属性,let声明的变量不是
2.var声明的变量在预解析的机制过程会有变量提升,但let的不会
3.var的作用域参考的是函数开辟的作用域,而let参考的块级作用域就是有(大括号{}就一个块级作用域)
4.var可以在相同的作用域重复声明相同的变量名的变量,而let声明的变量名不能相同,会报错
本文转载自:网络
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486