es6改进es5中的一些坑
来源:互联网 发布:软件升级管理 编辑:程序博客网 时间:2024/05/17 09:18
1. 块级作用域
es5中有一个比较坑的地方就是变量提升(variable hoisting),variable hoisting的根本原因就是es5中没有块级作用域。看一下下面的代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
注意,为什么add()
没有输出结果呢?因为变量提升。上面代码中,var b = 10
定义在if
中,由于es5没有块级作用域(函数体是es5中仅有的作用域块),所以变量b相当于在函数内部重新声明了一次,类似下面代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
使用es6中的let
关键字,就没有这么恶心了:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
值得一提的是,在for循环中使用var来定义变量,也会遇到变量提升的坑:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
如果不使用es6中的let
,需要使用JavaScript中的闭包来救火了:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
使用es6,在for
循环中使用let
定义变量:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
2. 箭头函数
在es5中,this
关键字像幽灵一般跳来跳去,不同的场景下this
指向的对象不同。常见的坑是在回调函数中使用this
,this
会脱离当前对象的上下文,而指向全局变量window
对象。看下面掉进坑的代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
注意到最后的p.getNameInCallback()
输出undefined。这个问题如何解决呢?如果不是使用es6来救火的话,可以考虑使用下面两个技巧:
1. 使用bind()
函数,为回调函数绑定上下文:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
2.使用其他变量代理this
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
如果使用es6中的箭头函数就没这么多事:
0 0
- es6改进es5中的一些坑
- es6改进es5中的一些坑
- ES6和ES5中的遍历
- JavaScript中的异步编程-ES5 & ES6
- es6和es5中的this指向
- ES5/ES6
- React.js中ES6 和 ES5写法的一些差别
- ES5中的var与ES6中的let,const的区别
- 简述ES5 ES6
- Babel es6 转 es5
- ES6与ES5差别
- es6转化为es5
- 浅谈JavaScript、ES5、ES6
- es6转es5
- webstorm es6--es5
- ES5,ES6互相转换
- 浅谈JavaScript、ES5、ES6
- 浅谈JavaScript、ES5、ES6
- Git教程学习(十)—搭建Git服务器
- 《山世光:深度化的人脸检测与识别技术》读书笔记
- eclipse插件OpenExplorer快速打开文件目录
- **注册验证短信**
- The type org.apache.tools.ant.Task cannot be resolved. It is indirectly referenced from required .cl
- es6改进es5中的一些坑
- 注释驱动的 Spring cache 缓存介绍
- 项目周期中的各个阶段
- redis源码学习之sds简单动态字符串
- Linux 知识收集
- Java SE 学习笔记:字符串的处理操作,随机数的生成,date日期类与格式化操作
- Linux下C库学习 - locale.h
- IIS中给网站添加匿名访问用户图文教程
- SVG图片的应用