在 ES5 中,声明变量只有 var 和 function 两种形式。但是var声明的变量会有一定的缺陷内层变量可能覆盖外层变量的问题以及用来计数的循环变量泄露为全局变量,下面有介绍),ES6
提出了使用 let
和const
声明变量,弥补了 ES5
中 var的缺点。
1、是否存在变量提升?
变量提升:在未定义之前可以使用变量而且不报错,是由 javascript 的预解析形成的
预解析:又称预解释,在浏览器拿到 js 代码将要执行之前,会整体的解读一遍 js 文件,把其中的 var声明的变量还有 function 提前定义
- var 声明的变量存在变量提升,let/const声明的变量不存在变量提升,会报错。
console.log(a); //undefined ===> a已声明还没赋值,默认得到undefined值
var v = 1
console.log(b); //报错:b is not defined ===> 找不到b这个变量
let l = 2
console.log(c); //报错:c is not defined ===> 找不到c这个变量
const c = 3
2.是否存在暂时性死区?
暂时性死区(简称 TDZ):在变量声明之前,任何的地方都不能去提前使用,一旦使用就会报错,那么这之前的这些代码,对于这个变量来说就是暂时性死区。
- var 声明的变量不存在暂时性死区, let/const 声明的变量存在暂时性死区。
3.是否允许重复声明变量?
- var 声明的变量允许重复声明变量, let/const 声明的变量在同一作用域不允许重复声明变量。
var a = 4;
var a = 5;
console.log(5) //5
let b = 6;
let b = 7;
console.log(7) //Identifier 'b' has already been declared
const c = 8;
const c = 9;
console.log(c) //Identifier 'c' has already been declared
4.是否存在块级作用域?
ES6 新增作用域 块级作用域 一个 { } 表示一个块级作用域
js 中的作用域: 全局作用域 、函数作用域 、块级作用域(ES6新增)
作用域链 在局部作用域(函数作用域/块级作用域)中访问一个变量,如果这个作用域不存在这个变量,那么根据作用域链查找的原则,会一层层向上查找,知道找到最顶层作用域(全局作用于)为止,如果还找不到 就会报错 xxx is not defined。
- var 不存在块级作用域, let/const 存在块级作用域。
//var声明的变量没有块级作用域
var a = 2;
for (var a = 0; a < 10; a++) {
}
console.log(a); //10
//let声明的变量存在块级作用域
var a = 2;
for (let a = 0; a < 10; a++) {
}
console.log(a); //2
5. 是否能修改声明的变量?
var
和let
可以。const
声明一个只读的常量。一旦声明,常量的值就不能改变。const
声明的变量不得改变值,这意味着,const
一旦声明变量,就必须立即初始化,不能留到以后赋值。
var a = 1;
a = 2;
let b = 1;
b = 100;
const c = 1;
c = 100; //Assignment to constant variable. //const声明的是一个常量 不能够重新赋值
var a;
let b;
const c; //Missing initializer in const declaration //const声明的变量必须要进行初始化
-
const 声明的变量 如果赋值为一个引用数据类型的值,那么是可以修改值里面的内容的,只要不去修改这个变量所指向的内存空间地址即可。
const c = {
n: 1
};
c.n = 100
//const应用
const PI = 3.1415926;
const API = "http://www.baidu.com";