我们可以围绕以下问题展开测试
是否存在变量提升
是否存在暂时性死区
是否允许重复声明变量
是否存在块级作用域
是否能修改声明的变量
是否存在变量提升
先说一下什么是变量提升
变量提升就是在未定义之前可以使用而且不报错 (上代码)
console.log(xfn1) //undefined
var xfn1 = 111;
console.log(xfn2) //ReferenceError: g is not defined
let xfn2 = 222;
console.log(xfn3) //ReferenceError: g is not defined
const xfn3 = 333;
var 有变量提升 他不会报错 而是会返回一个undefined
let const 这两个就没有变量提升会报错 所以他们两个需要先声明在使用
变量提升中还有一个问题 预解释
什么是预解释
当js引擎读到js文档的时候,在js代码执行之前,就先把所有带var和function的进行提前定义(变量提升的原因。)
是否存在暂时性死区
暂时性死区就是在变量声明之前,任何的地方都不能去提前使用,一旦使用就会报错,那么这之前的这些代码,对于这个变量来说就是暂时性死区
let const 都存在暂时性死区 var 不会存在暂时性死区
是否允许重复声明变量
var a = 10
var a = 11
//控制台无异常
let b = 11
let b = 22
//控制台报错 Uncaught SyntaxError: Identifier 'b' has already been declared
const c = 11
const c = 22
//控制台报错 Uncaught SyntaxError: Identifier 'c' has already been declared
var 可以重复声明
let const 不可以重复声明 会报错显示标识符以声明
是否存在块级作用域
作用域 分为 全局作用域 函数作用域 ES6 新增块级作用域 (例 {}大括号 if语句 for循环语句 )
//1,解决内层变量可能覆盖外层变量的问题
var b = 2;
function fun1(){
console.log(b) //2 访问的外层变量
if(false){
let b = 3;//不存在变量提升,变量存在于块级作用域之中。
}
}
fun1()
//2,解决用来计数的循环变量泄露为全局变量。
var a1 = 'hello';
for (let a = 0; a < a1.length; a++) {
console.log(a1[a]); //a存在于块级作用域之中,和其绑定
}
console.log(a); // 报错
var 不存在块级作用域
let const 存在块级作用域
是否能修改声明的变量
var aa = 11
aa = 22
console.log(aa); //22
let cc = 22
cc = 12
console.log(cc); //12
const bb = 21
bb = 11 //直接报错
var let 声明的是变量可以直接修改
const 声明的是常量 会直接报错