const关键字
- const 是声明
常量
的 - 变量: 可以变化的量,顾名思义,声明后还可以对它进行修改
- 常量: 声明的数据不能修改的
const num2 = 10 num2 = 30 // 报错,因为常量值不能被修改
- const也是认块级作用域
{ const num = 10 console.log(num) } console.log(num) // 报错,const也认块级作用域
- const跟let的区别,只有一个是不允许修改,一个是可以修改,其他都是一样的
- const可以用在哪?
-
- 当你需要确保一些数据不能被修改时就用 const
- 例如:圆周率,做活动时的折扣,例如打8折(0.8),定好0.8后不允许被改也可以用常量
全局作用域
- 顾名思义:全局作用域里声明的变量、常量,在所有作用域里都能被访问
- 全局作用域指的是从
script
开头 到script
结尾的不加任何括号的区域
<script> // 全局作用域 { //块级 局部作用域 } // 全局作用域 function fn() { // 函数 局部作用域 } // 全局作用域 </script>
- 全局作用域声明的变量是全局变量,那么这种变量会伴随着从网页打开,到网页关闭才会销毁和回收内存空间
- 所以要少声明全局变量,不然会一直占着内存空间,除此以外还会造成变量名污染(占用了一个变量名)
作用域链
预解析
- 浏览器在执行JS代码之前,会先把所有的变量与函数声明先解析一遍
-
- 为什么要这么做?
-
-
- 因为它需要提前确定大概开多少个空间,空间够不够,先提前开好
- 这样子到时候执行代码,就不用临时开空间,大大提升性能等好处
-
- 所以总而言之,预解析是在正儿八经执行代码之前来解析的,所以称之为预解析
- 如何验证,是在代码执行之前解析的?
-
- 以前就算某句代码报错,但是它前面的代码会被执行,只是后面代码不再执行了
- 但是如果你是变量声明报错,里面一句代码都不会执行,所以证明有个阶段叫预解析,在预解析里如果发现变量声明报错,那么后面代码就不执行
// 证明有个阶段肯定是在执行代码以前就来解析的 // 这个阶段就叫预解析 console.log('111111') let age = 99 let age = 999 // let是不允许在同一个作用域里声明多个同名变量的,所以要报错 console.log('222222')
变量与函数提升
- 预解析阶段里
-
- 除了有检测变量声明是否正常,和解析要开多少空间以外
- 还有个步骤,就是变量提升与函数提升
- 变量与函数提升
-
- 指的是所有用
var
声明的变量和function
声明的函数,会把他们的声明语句提前到它所在的作用域最顶端,赋值语句留在原地 - let没有提升
- 指的是所有用
- 例:
console.log(age) // undefined 因为变量提升后,var age会提升到最前面 var age = 99 console.log(age) // 99
var与let、const的区别总结
- 相同点:他们都是声明变量(也就是说值可以改变)
- 不同点:
-
- 作用域不一样,var认函数作用域, let认块级作用域
- var参与变量提升,let不参与变量提升
-
- var声明的全局变量是window的属性,let声明的全局变量不是window的属性
- var可以在同一个作用域里声明多个同名变量,let不允许,会报错
- const跟let特点一样,只不过const的值不允许修改