ES 6 新特性一览:https://frankfang.github.io/es-6-tutorials/
教程:es6.ruanyifeng.com
先学 ES 5 还是 ES 6
无聊的问题,ES 6 包含 ES 5,你无论如何都必须先学 ES 5,才能看懂 ES 6
ES 6 如何学
- 快速通览,然后使用
- 边使用边加深印象
自学的问题
你不知道一个语法为什么要存在
- 触类旁通,去看看其他语言有没有这个语法,怎么用的
- 反证法,如果不用这个语法,该怎么实现需求
let & const
- 四种情况
- a = 1
- var a = 1
- let a = 1
- const a = 1
- a = 1
- ES3语法
- 这句话会声明一个全局变量,这个说法是错误的
- 含义不明
- var a = 1
- ES3语法
- 变量会在作用域范围内提升
- 报错
- image.png
- 不报错
- image.png
-
JS中使用局部变量需要用函数包围,使用匿名函数加括号直接调用可以做到没有暴露全局变量
*
image.png
- let a = 1
- ES6语法
- let的作用域只在花括号里面,不会往外面跑
- image.png
- 使用var可以出来
- image.png
- 高亮部分是一个临时死区,在蓝色这部分里面,a是不能被使用的,一旦使用就报语法错误;let具有临时死区,如果不声明就使用会直接报错
- image.png
- const a = 1
- const和let唯一的区别在于,const声明的变量只能一次赋值,不可进行二次赋值,但是let可以进行二次赋值
- image.png
- 我们一般在使用常量的时候,使用const,如PI,e等
- 总结
- let
- let的作用域在最近的块{}之间
- 如果在let a之前使用a,会报错
- 如果你重复使用let a,那么报错
- const
- const与let的区别在于,const只有一次赋值机会,并且必须在声明的时候立马赋值
- let
- 忠告:永远不要使用var
- 面试题
- 使用let
- image.png
- 使用立即执行函数
- image.png
- 直接在for循环中使用let
- 这种写法是一种魔法,正常使用应该是使用j来承接i,但是这样使用,后台会自动走这种过程,for循环中i的作用域只在for()的这个括号里面,后面的花括号是访问不到i的。for循环后面的{}会首先创建一个i,这个i等于外面这个i的值。
- 花括号里面首先会添加一个i等于()里面的i,{}里面的i发生任何变化都会在循环结束之后返回给下一个循环的i
- image.png
- 上面这个里面总共有7个i,一个是圆括号里面的i,始终贯穿循环的始终,{}里面有6个块级的i,都叫做i
- 使用let
箭头函数
- 箭头函数的出现是因为this太难用了
- this是call的第一个参数
- ES3支持this
-
ES6也支持this,但是用箭头函数弱化了this的用法
image.png -
ES3中函数的参数会放入一个叫arguments的对象中
image.png - call的第一个参数是this,但是this必须得通过看文档知道,每一个函数都有隐藏的this,this的确定需要看文档才知道,当函数里面还有一个函数,那么最里面的函数的this不一定是外面的this。
-
箭头函数没有this这个概念,this就是上文中的this,即便使用call来调用,并传入第一个参数,也不会作为this
image.png -
使用箭头函数,可以全文不使用this,但是需要像python传入一个self,是一种很纯粹的语法思路,没有任何潜在规则
image.png - 以前的函数会有一个潜在的this,这个this只能通过使用call函数手动指定
- 箭头函数这样写,是抄袭了coffeescript,这个语言是ruby社区发明的
-
箭头函数对JS语言表现力是有极大增强的
image.png -
Ruby优雅但是慢
image.png - Vue依赖this,不建议使用箭头函数
-
一个题目:this指向什么?
image.png