### ES6中let创建的变量不存在变量提升
/*
* 在ES6中基于let或者CONST等方式创建变量或者函数,不存在变量提升机制
*
* -> 切断了全局变量与WINDOW属性的映射机制
* ->在相同的作用域中,基于LET不能声明相同名字的变量(不管用什么方式在当前作用域下声明了变量,再次使用let创建都会报错)
* -> 虽然没有变量提升机制,但是在当前作用域代码自上而下执行之前,浏览器会做一件重复性检测,自上而下查找当前作用域下所有变量,一旦发现重复的,直接抛出异常,代码也不会执行了(虽然没有把变量提前声明定义,但是浏览器已经记住了当前作用域下有那些变量)
* /
/*
console.log(a) //a is not defined
let a = 12;
let fn = () => {};
console.log(window.a) // undefined
console.log(a)
*/
/*
let a = 12; // Identifier 'a' has already been declared
var a = 13;
console.log(a);
*/
/*
虽然没有把变量提前声明定义,但是浏览器已经记住了当前作用域下有那些变量(重复检测)
a = 12; //a is not defined;
console.log(a);
let a = 13;
comsole.log(a);
*/
let a = 10,b = 10;
let fn = function () {
//console.log(a,b) // a is not defined
let a = b = 20;
// * let a = 10
// * b = 20 // =》 把全局中的b=20
console.log(a,b) // 20,20
}
fn()
console.log(a,b) // 10,20
### js 暂时性死区
var a = 12;
var b = 13;
if(true){
console.log(a);//a is not defined
let a = 13; //基于let创建变量,会把大部分{}当做一个私有的块级作用域(类似于函数的私有作用域),在这里也是重新检测语法和规范,看一下式否式基于新语法创建的变量,如果是按照新语法规范来解析
console.log(b) //13
}
/*
老版本 - 没有声明,不会报错
console.log(typeof a); // "undefined",在原有浏览器渲染机制下,基于typeof等逻辑运算符检测一个未声明过的变量,不会报错,返回UNDEFINED
*/
/*
es6解决了暂时性死区的问题
console.log(typeof a) // a is not defined
let a; //=> 如果当前变量是基于es6语法创建的,在没有声明这个变量的时候,使用typeof检测会直接报错,不会是undefined,解决了原有的js死区
*/
网友评论