ES6系列之箭头函数
本系列是在平时阅读、学习、实际项目中有关于es6中的新特性、用发的简单总结,目的是记录以备日后温习;本系列预计包含let/const、箭头函数、解构、常用新增方法、Symbol、Set&Map、Proxy、reflect、Class、Module、Iterator、Promise、Generator、async/await。。。
箭头函数顾名思义就是带箭头的函数,^-^,其实想表达的是箭头函数本质还是函数,那箭头函数和es5的函数有什么区别呢?
- 不绑定this
var obj = {
age: 1,
say: function() {
setTimeout(function() {
console.log(this, this.age); // window undefined
}, 0);
},
} var obj1 = {
age: 1,
say: function() {
setTimeout(() => {
console.log(this, this.age); // obj1 1
}, 0);
}
};这里可以看出箭头函数中访问的this实际上是其父级作用域中的this,箭头函数本身的this是不存在的,这样就相当于箭头函数的this是在声明的时候就确定了(因为相当于作用域嘛),这个特性是很有用的
var handler = {
id: '111',
doSomething: function(e) {
console.log(e);
},
init: function() {
document.addEventListener('click', (event) => { // 这里绑定事件,函数this就可以访问到handler的方法doSomething
this.doSomething(event);
}, false);
}
} handler.init(); - 不可以作为构造函数来使用
var Person = (name) => { // Uncaught TypeError: Person is not a constructor
this.name = name;
} var person = new Person('Jack');这个特性很容易测试,如果上一条明白的话也很容易理解: 箭头函数压根就没有this,当然不能作为构造函数(如果明白构造函数new的过程的话,插一句: new的过程其实就是创建一个对象,将this指向该对象,然后执行代码初始化这个对象,最后返回)
- 不绑定arguments(如果有要使用arguments的时候可以使用rest参数代替)
var foo = (val) => {
console.log(arguments); // Uncaught ReferenceError: arguments is not defined
};
foo();这个特性也很好测试,但是实在要使用arguments对象要怎么办呢?我们可以使用es6的另一个新特性rest参数,完美替代
var foo = (...args) => {
console.log(args); // [1, 2, 3]
};
foo(1, 2, 3); - 不可以使用yield命令,因此箭头函数不能用作Generator函数(这个后面总结到generator函数时再做解释)
箭头函数不适用的场景(或者不建议使用的场景)
这里说的不适用有些是压根不能用,有些是如果使用了箭头函数可能会产生意想不到的结果
- 作为对象的属性
var obj = {
a: () => {
console.log(this); // window
}
};作为对象的属性时,this的指向则不再是对象本身了,这就造成了意想不到的结果
- 构造函数(前文已经说过)
- 作为原型方法
function Person(name) {
this.name = name;
} Person.prototype.say = function() {
console.log(this); // 指向实例
}; Person.prototype.bark = () => {
console.log(this); // window
}; var pe = new Person('Jack');
pe.say(); // {name: 'Jack'}
pe.bark(); // window从例子中我们看到了,箭头函数作为原型方法时,this指向出乎了我们的意料
- 需要动态this的时候(这个地方需要自己进行判断),这里只举个例子便于理解
document.addEventListener('click', () => {
console.log(this); // window
}, false); document.addEventListener('click', function() {
console.log(this); // #document对象
}, false); // 一般情况,我们绑定事件处理函数时希望函数内部的this指向绑定的Dom对象,但是如果使用了箭头函数,则this则会出乎我们的意料
ES6系列之箭头函数的更多相关文章
- [js高手之路] es6系列教程 - 箭头函数详解
箭头函数是es6新增的非常有意思的特性,初次写起来,可能会觉得别扭,习惯之后,会发现很精简. 什么是箭头函数? 箭头函数是一种使用箭头( => )定义函数的新语法, 主要有以下特性: 不能通过n ...
- ES6学习之箭头函数
ES6学习笔记--箭头函数 箭头函数一直在用,最近突然想到重新看一下箭头函数的用法,所以这里做一些总结. 箭头函数长这个样子: let fn = a => a++; // fn 是函数名, a= ...
- 前端项目中常用es6知识总结 -- 箭头函数及this指向、尾调用优化
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...
- JS ES6中的箭头函数(Arrow Functions)使用
转载这篇ES6的箭头函数方便自己查阅. ES6可以使用“箭头”(=>)定义函数,注意是函数,不要使用这种方式定义类(构造器). 一.语法 基础语法 (参数1, 参数2, …, 参数N) => ...
- es6学习笔记--箭头函数
基本用法 ES6允许使用“箭头”(=>)定义函数. var f = v => v; 上面的箭头函数等同于: var f = function(v) { return v; }; 如果箭头函 ...
- codewars--js--Reverse or rotate?----es6变量,箭头函数,正则取块
问题描述: 对输入的str按照sz个数进行分块,若一块内所有数字的立方和是偶数,则倒序:否则,向左移动一位.然后将修改过的块整合到一个字符串,作为输出. The input is a string s ...
- 从 ES6 高阶箭头函数理解函数柯里化
前言:第一次看到多个连续箭头函数是在一个 react 项目中,然鹅确认了下眼神,并不是对的人,因为看得一脸懵逼.em......于是开始各种搜索,先是知道了多个连续箭头函数就是 es6 的多次柯里化的 ...
- ES6中的箭头函数
关于函数表达式中的this:自动引用正在调用当前方法的.前的对象1.obj.fun()中的this fun中的this -> obj2.new Fun() Fun中的this -> 正在创 ...
- ES6中的箭头函数和普通函数有什么区别?
1.普通函数中的this总是指向调用它的那个对象, 箭头函数没有自己的this,他的this永远指向其定义环境,任何方法都改变不了其指向,如call().bind().apply().(正是因为它没有 ...
随机推荐
- Struts2 前台显示问题
遇到的问题: 查询字段相同值的和的时候用到了sum函数,导致和实体类的不一样,无法取到. 开始的时候的代码. ; 这样的话SUM(o_count)无法显示. 我想把SUM(o_count)设置为实体类 ...
- web3js 进行转账
1.准备阶段 部署以太坊geth 安装nodejs npm install web3 npm install npm install ethereumjs-tx 其中, web3是1.0.0.beta ...
- 常用且难记的一些css
1.多行文字超出隐藏,自动追加 ... 移动端兼容更好,pc下只能兼容 Safari.Opera 以及 Chrome 等部分浏览器,挺常用. (注:为什么要同时加这几个css不在这里详细叙述,详见) ...
- 尝鲜svnup
最近有同事折腾了一下svnup的编译,终于可以在Mac OS X和Linux上面编译通过了,仓库在这里:https://github.com/lvzixun/svnup/ svnup这个工具只有一个功 ...
- SQLalchemy 字段类型
常用的SQLAlchemy列选项 类型名 python中类型 说明 Integer int 普通整数,一般是32位 SmallInteger int 取值范围小的整数,一般是16位 BigIntege ...
- HDU - 5755:Gambler Bo (开关问题,%3意义下的高斯消元)
pro:给定N*M的矩阵,每次操作一个位置,它会增加2,周围4个位置会增加1.给定初始状态,求一种方案,使得最后的数都为0:(%3意义下. sol:(N*M)^3的复杂度的居然过了. ...
- UVa 712
这个题根本不用建树,因为是完全二叉树,可以把这个想成二进制.对于根是二进制数的首位,之后依次类推.到最后的叶子节点就是从0到pow(2,n)-1. 关键在于在第一次输入的不是按照x1,x2,x3,x4 ...
- MHA-Atlas-MySQL高可用集群2
MHA脚本管理方式 (1)获取管理脚本master_ip_failover 提示:yum安装的manager是没有这个脚本的. 我们需要从manager的源码包里复制一个. [root@mysql ...
- 第二次Scrum冲刺——Life in CCSU
第二次Scrum冲刺——Life in CCSU 一. 第二次Scrum任务 继续上一次冲刺的内容,这次完成论坛部分. 二. 用户故事 用户输入账号.密码: 用户点击论坛部分: 系统显示帖子: 用户选 ...
- FlappyBird开发帮助文档
FlappyBird开发帮助文档 项目需求 完成FlappyBird游戏. 功能说明: 游戏开始后,间歇性的点击鼠标,让小鸟向上飞,不会掉下来,并且要穿过柱子的空隙,不能碰到柱子,碰到就dead了,穿 ...