一.什么是ES6
ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版。
ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里并没有类的概念,但是目前浏览器的 JavaScript 是 ES5 版本,大多数高版本的浏览器也支持 ES6,不过只实现了 ES6 的部分特性和功能。
二.Es6语法
1.变量
ES6之前声明变量有两种方式 var 和 function ,还有一种隐藏的变量,函数的形参,即函数的私有变量;
ES6提供的四种声明变量的方式:let , const , Class , import
(1)var定义的变量
作用:有变量提升但不定义赋值,还给window提供了一个对应的属性
(2)function定义的变量
作用:提前声明并同时定义赋值,这种叫做函数提升
函数的参数默认值:
①写法上 有默认值的写后面,没默认值的写前面
②如果传对应的参数,就不要默认值了,不是先传默认参数,再用实参覆盖
(3)let定义变量
作用:不存在变量提升,在声明前不能使用,不能重复使用,也不会给window添加一个属性
2.作用域
作用域分为全局作用域和局部作用域;全局:window下声明的变量及函数外声明的变量都在全局作用域下运行;局部:函数内声明的变量都在局部作用域下运行。
浏览器的运行机制:浏览器在执行时会生成一个全局环境叫做window,window分为两个模块,栈和堆,栈是存放变量的内存地址。堆用来存放代码块,然后浏览器
(1)var的作用域
window下所有的var,在if条件中,不管if语句中的条件成立不成立,都有变量提升
//在window下的var都有变量提升
var a=true; console.log(b) //undefined if(a){ var b=123; }
(2)function
function声明的变量会给window添加一个属性,属性值是方法
函数的归属问题:跟在哪儿调用的无关,跟在哪儿定义的有关
//函数归属问题
var a=56; function fn(){ var a=12; return function ff(){ console.log(a) } } var ff=fn();
ff()
函数在if语句中的特殊情况:只提前声明但是不定义,只有条件成立了,if语句中的所有函数都会在第一时间被定义,然后再执行if语句中的其他代码
var a=true; console.log(ff) //undefined if(a){ console.log(ff) //函数ff function ff(){ console.log(111) } } console.log(ff) //函数ff
(3)let的作用域 ES6提供了一种叫做块级作用域的概念
块级作用域运用于在if条件语句 for循环语句和对象,只有let 和 const有块级作用域的个概念 ,但是var没有
①在块级作用域下,var和function没有作用,在块级中的function在块级前是只声明未定义的,但是在块级作用域中第一时间被定义
②在块级作用域中,let和const声明的变量是私有的,外面访问不到
③for循环下,let声明的变量不会泄露
//用var 写事件,在浏览器中事件都是异步的,当事件执行的时候,for循环也执行完了 所以每次点击都会输出 3 for(var i=0;i<btns.length;i++){ btns[i].onclick=function(){ alert(i) } } 用let的话 let声明的变量不会泄露 会正常输出 0 1 2 for(let i=0;i<btns.length;i++){ btns[i].onclick=function(){ alert(i) } }
④块级作用域和对象该如何区分
{}前面什么都不加的就是块级作用域 对象的话一定要将{}赋值给一个变量
{ a:"hahah", b:123 } //Uncaught SyntaxError: Unexpected token : //会报错 console.log({ a:"hahah", b:"dbhcb" }) //给{}加一个()就好了
⑤暂时性死区:块级作用域中只要存在let或const命令,就绑定了整个块级作用域,凡是在声明前使用变量,都会报错
⑥var a=a; 和 let a=a; js中的赋值是从右往左,因为var有变量提升,所以不报错;但是Let没有变量提升 所以会报错
⑦块级作用域中 子可访问父的变量
{ let a= 5; { console.log(a) } // 5 }