【1】ES6中的let和const
let基础语法
let 变量名=变量值
使用let创建变量和使用var创建变量的区别?
(1)let没有变量提升
ES6中只提供了创建变量的新语法标准(let)创建函数还是沿用ES5中的function(还会存在变量提升)如果想让函数也存在变量提升,都使用函数表达式赋值的方式操作:
let fn=function(){ }
所以
创建变量 let xxx=xxx;
创建函数 let xxx=function(){ }
创建自执行函数 (function(){ })();
这样处理的好处:
此时代码中就不要再考虑变量提升了,只要这样处理,没有所谓的变量提升
(要不有的提升 有的不提升容易晕 所以就直接都用let xxx=函数表达式)
(2)使用let定义的变量不允许在同一个作用域中重复声明
let str="111";
let str="222";
console.log(let);
当前报错 Uncaught SyntaxError:Identifier “str” has already been declared,
上面代码也不会执行(在JS代码执行之前就已经知道有重复声明了,也就是浏览器依然存在类似于变量提升的机制:在JS代码之前先把所有let声明的变量定义一遍,发现有重复的直接报错)
当前作用域下别重复声明即可
(不同作用域中的变量是自已私有的,名字重复没有关系)
let num=12;
num=13;
console.log(num)//--->13
// let 不允许重复声明,但是允许重新赋值
如果我先 var att=300; 再 let att=400 也会报错
也就是说不管你之前用什么方式在当前作用域中声明的变量,再使用let声明的时候 都会报错
let也存在私有变量和作用域链的概念,和ES5中基本上差不多
(3)暂时性死区:不可以提前使用未被定义的变量
ES5中当前变量不存在,但是使用typeof检测的时候,不会提示错误,而是返回undefiend
console.log(typeof num);—》unfeined
但是:如果我在下边加了个 let=num
console.log(typeof num);—》报错
let=num
ES6中检测一个没有被声明过的变量直接报错,不像之前ES5中的值是undefined一样了
let=num
console.log(typeof num);—》undefined
只声明 没有定义
默认值就是undefined
(4)ES6语法创建的变量(let)存在块级作用域 ES5语法创建变量(var/function)没有块级作用域
【在ES5中】
window全局作用域
函数执行形成的私有作用域
【在ES6中】
除了有ES5中的两个作用域,ES6中新增加块级作用域(我们可以把块级作用域理解为之前学习的私有作用域:存在私有变量和作用域链的一些机制)
ES6语法中把大部分用大括号包起来都称之为块级作用域
当前JS并没有开启严格模式,所以形参变量和实参集合存在映射机制(但是:我们以后尽量不要这样处理:因为ES6编译为ES5后,会默认的开启严格模式,映射机制会中断,此处的值依然是"猴七",这样导致我们的ES6结果和ES5结果不一样)
判断体也是一个块级私有作用域,
在这个作用域中声明的变量是私有变量,在块级作用域之外是无法使用的
循环体也是一个块级作域 每一次循环都会形成一个新的块级作用域 当前案例形成5个块级作用域
每一个块级作用域都有一个私有变量i 分别存储的是0到4
这是一个ES6中标准的块级作用域
虽然ES6没有变量提升,但是每一次进入当前作用域都会把let定义的变量找一遍(不提升但是找了,找到了说明当前作用域中是有这个变量的,提前用都会报错)
try catch 中任何大括号都是块级作用域
switch 也是块级作用域
for in 也是块级作用域
大部分我们遇到的大括号操作都是 ------> 块级作用域
ES6增加块级作用域的作用?
eg:选项卡
【2】const的基础语法
const的细节知识点和let一样,和let的主要区别在于:let是创建变量,const是创建常量
变量:值是可以修改的
常量:值不能被修改
而且使用babel如果遇到了const设置常量 再进行修改 就无法进行编译了
【3】JS中创建变量方式汇总
var :ES5中创建变量
function:ES5中创建函数
ES5中创建变量或者函数存在:变量提升、重复声明等特征
var :ES6中创建变量
const:ES6中创建常量
ES6中创建的变量或者常量都不可以变量提升,也不可以重复声明,而且还存在块级作用域
class:ES6中创建类的方式
import:ES6中模块导入的方式