1.是否存在变量提升?
var声明的变量存在变量提升
var声明的变量存在变量提升,它会将声明的变量提升到当前作用域的最顶端,使得变量在声明之前可以使用,返回一个undefined。
console.log(a);//undefined
var a = 1;
let/const声明的变量不存在
console.log(b) //ReferenceError: Cannot access 'b' before initializationat
let b=2
console.log(c) //ReferenceError: Cannot access 'c' before initializationat
const c=3
initializationat //初始化
let||const 不能在初始化之前使用不然就报错
这两个方法声明的变量要在声明后使用,否则就会报错!
2.是否存在暂时性死区?
let/const声明的变量存在
var a = 1
{
console.log(a);
let a = 2
console.log(a);
}
console.log(a);
只要块级作用域内 存在let命令,它所声明的变量就会“绑定”这个区域,不在受外部的影响。
如果块级作用域存在let和const,并且用let和const声明一个变量之前,都不能使用这个变量,否则就会报错,在这之前的代码块,对于这个变量来说都叫暂时性死区。
3.是否允许重复声明变量?
var声明的变量可以重复声明
var a = 1;
console.log(a);//1
a = 2;
console.log(a);//2
let/const声明的变量不可以重复声明
let b = 1;
console.log(b);//1
let b = 100
console.log(b);//Identifier 'b' has already been declared
const c = 1;
console.log(c);//1
const c = 100; //Identifier 'c' has already been declared
console.log(c);
Identifier 'XXX' has already been declared————标识符b已经被声明了
4.是否存在块级作用域?
块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。同时,函数声明还会提升到所在的块级作用域的头部。
{
if (4 < 2) {
function fn() {
console.log("111");
}
}
}
fn()//fn is not a function
{
let a = "呵呵"
let fn = function () {
console.log("呵呵");
}
console.log(a, fn); // 呵呵 ƒ () {console.log("呵呵");}
}
注意:ES6中允许函数在块级作用域中可以声明的条件是必须在大括号里面,否则就会报错。
if (4 > 2) {
let fn = function () { }
}
if (4 > 2)
let fn = function () { }
// Uncaught SyntaxError: Lexical declaration cannot appear in a single-statement context
5.是否能修改声明的变量?
const声明的变量不可修改----let和var声明的变量可以修改
因为const声明的是一个常量,一旦声明常量的值就不能被改变。const一旦声明变量,就必须立即初始化,不能留到以后再赋值
var a=1;
a=2;
console.log(a)//2
let b=3;
b=4;
console.log(b)//4
const c=5;
c=6;
console.log(c)//报错 不能进行重复声明 TypeError: Assignment to constant variable
const c = {
n: 1
};
c.n = 100
console.log(c.n);///100
const声明的变量 如果赋值为一个引用数据类型的值,那么是可以修改值里面的内容的,
只要不去修改这个变量所指向的内存空间地址即可