=> js 中箭头函数使用总结
- 箭头函数感性认识
- 箭头函数 是在es6 中添加的一种规范
- x => x * x 相当于 function(x){return x*x}
- 箭头函数相当于 匿名函数, 简化了函数的定义。 语言的发展都是倾向于简洁 对人类友好的, 减轻工作量的。 就相当于我最钟情的python, 有很多类似之处, 在 关于promise 文章中我会和Python 框架中的tornado 中的异步进行对比的, 很相似。
- 箭头函数有两种格式, 一种只包含一个表达式,没有{…} 和 return 。 一种包含多条语句, 这个时候{} return 就不能省略
- x => {
- if (x>0){
- return x*x
- }else{
- return x
- }
- }
- 如果有多个参数就要用():
- // 两个参数返回后面的值
- (x, y) =>x*y + y*y
- //没有参数
- () => 999
- // 可变参数
- (x, y, ...rest) =>{
- var i,sum = x+y;
- for (i=0;i<rest.length;i++){
- sum += rest[i];
- }
- return sum;
- }
- 如果要返回一个单对象, 就要注意, 如果是单表达式, 上面一种会报错, 要下面这种
- // 这样写会出错
- x => {foo:x} // 这和函数体{}有冲突
- // 写成这种
- x => {{foo:x}}
- 箭头函数中this 指向
- 箭头函数 看起来是匿名函数的简写。但是还是有不一样的地方。 箭头函数中的this是词法作用域, 由上写文确定
- var obj = {
- birth: 1990,
- getAge: function () {
- var b = this.birth; //
- var fn = function () {
- return new Date().getFullYear() - this.birth; // this指向window或undefined
- };
- return fn();
- }
- };
- 箭头函数修复了this的指向, this 总是指向词法作用域, 也就是外层调用者obj:
- var obj = {
- birth: 1990,
- getAge: function () {
- var b = this.birth; //
- var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
- return fn();
- }
- };
- obj.getAge(); //
- 如果使用箭头函数,以前的那种hack写法 就不需要了:
- var that = this;
- 由于this 在箭头函数中已经按照词法作用域绑定了, 所以施一公call 或者apply() 调用函数的时候, 无法对this 进行绑定, 即 传入的第一个参数被忽略:
- var obj={
- birth:2018,
- getAge:function(year){
- var b =this.birth;//
- var fn = (y)=>y-this.birth //this.birth 仍然是2018
- return fn.call({birth:200},year)
- }
- }
- obj.getAge(2020)
- 下面对比写es5 es6 直接关于箭头函数的对比使用
- //es5
- var fn = function(a, b){return a+b}
- //es6 直接被return时候可以省略函数体的括号
- const fn=(a,b) => a+b;
- //es5
- var foo = function(){
- var a=20;
- var b= 30;
- return a+b;
- }
- //es6
- const foo=()=>{
- const a= 20;
- const b=30;
- return a+b
- }
- // 注意这里 箭头函数可以替代函数表达式但是不能替代函数声明
- 再回到this 上面来,箭头函数样意义上面来说没有this. 如果使用了this 那么就一定是外层this .不会自动指向window对象。所以也就不能使用call/apply/bind来改变this指向
- var person = {
- name: 'tom',
- getName: function() {
- return this.name;
- }
- }
- 使用es6 来重构上面的对象
- const person = {
- name:'tom',
- getName:()=>this.name
- }
- 这样编译的结果就是
- var person ={
- name:'tom',
- getName:function getName(){return undefined.name}
- }
- 在ES6中,会默认采用严格模式,因此this也不会自动指向window对象了,而箭头函数本身并没有this,因此this就只能是undefined,这一点,在使用的时候,一定要慎重慎重再慎重,不然踩了坑你都不知道自己错在哪!这种情况,如果你还想用this,就不要用使用箭头函数的写法。
- // 可以稍做改动
- const person = {
- name: 'tom',
- getName: function() {
- return setTimeout(() => this.name, 1000);
- }
- }
- // 编译之后变成
- var person = {
- name: 'tom',
- getName: function getName() {
- var _this = this; // 使用了我们在es5时常用的方式保存this引用
- return setTimeout(function () {
- return _this.name;
- }, 1000);
- }
- };
=> js 中箭头函数使用总结的更多相关文章
- js中箭头函数和普通函数this的区别
最近在学习angularJs的时候由于里面涉及到了箭头函数,箭头函数除了声明上有点区别以外,和普通函数最主要的区别还是在this的问题上. Js中函数中嵌套的函数this不会 “继承”.比如说以下代码 ...
- js中箭头函数 及 针对箭头函数this指向问题引出的单体模式
ES6允许使用“箭头”(=>)定义函数 var f = a = > a //等同于 var f = function(a){ return a; } 如果箭头函数不需要参数或需要多个参数, ...
- JS中的函数,Array对象,for-in语句,with语句,自定义对象,Prototype
一)函数 A)JS中的函数的定义格式: function add(a,b) { var sum = a+b; document.write("两个数的和是:" + sum); // ...
- js中的函数,Date对象,Math对象和数组对象
函数就是完成某个功能的一组语句,js中的函数由关键字 function + 函数名 + 一组参数定义;函数在定义后可以被重复调用,通常将常用的功能写成一个函数,利用函数可以使代码的组织结构更多清晰. ...
- js中getByClass()函数
js中getByClass()函数进化史 对于js来说,我想每一个刚接触它的人都应该会抱怨:为什么没有一个通过class来获取元素的方法.尽管现在高版本的浏览器已经支持getElementsByCla ...
- JS中的函数、Bom、DOM及JS事件
本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的 ...
- node.js 中回调函数callback(转载),说的很清楚,看一遍就理解了
最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: 复制代码 代码如下: app.use(fu ...
- JS中的函数、BOM和DOM操作
一.JS中的函数 [关于注释] /** [文档注释]:开头两个*.写在函数上方,在调用函数时可以看到文档上方的描述信息. */ // 单行注释 /* 多行注释 */ 1.函数的声明及调用 (1) ...
- html css <input> javaScript .数据类型 JS中的函数编写方式 BOM总结 DOM总结
Day27 html css div 块标签. 特点: 独占一行,有高度和宽度 span 行元素. 特点:在同一行显示,当前行满了自动去下一行显示. 不识别高度和宽度 1.1.1.1 2.输入域标签 ...
随机推荐
- deepin安装Python3.6和pip
1.安装python3.6 sudo apt-get install python3.6 2.修改软连接 sudo ln -s /usr/local/bin/python3.6 /usr/bin/py ...
- centos6安装多实例mysql
centos 6.5,使用二进制安装多实例mysql 5.5.60 所需安装包mysql-5.5.60-linux-glibc2.12-x86_64.tar.gz.ncurses-devel-5.7- ...
- gdb远程debug A syntax error in expression, near `variable)'.
今天调试有个linux环境的应用时,gdb提示A syntax error in expression, near `variable)'.,最后经查,gdb版本过低(比如7.2)或者源代码不匹配所致 ...
- 2018-2019-1 20189206 《Linux内核原理与分析》第四周作业
linux内核分析学习笔记 --第三章 MenuOS的构造 计算机的"三大法宝"和操作系统的"两把宝剑" 三大法宝 程序存储计算机 即冯诺依曼体系结构,基本上是 ...
- QT笔记之内存管理
转载:https://blog.csdn.net/myjqc/article/details/8569196 (链接错误解决办法) 我们都知道在C++中,new和delete是成对出现的,那么在QT中 ...
- 枚举+排序|神奇算式|2014年蓝桥杯A组题解析第三题-fishers
标题:神奇算式 由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成. 比如: 210 x 6 = 1260 8 x 473 = 3784 27 x 81 = 2187 都符合要求. ...
- (zhuan) Notes on Representation Learning
this blog from: https://opendatascience.com/blog/notes-on-representation-learning-1/ Notes on Repr ...
- 【转载】RabbitMQ基础知识
本文转自: https://www.cnblogs.com/dwlsxj/p/RabbitMQ.html 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message ...
- Xilinx_ISE 14.7 Win10 闪退
打开D:\Xilinx\14.7\ISE_DS\ISE\lib\nt64 将libPortabilityNOSH.dll 重命名为libPortability.dll,替换原libPortabilit ...
- 前端面试题 | JS部分(附带答案)
目前在找工作,所以各方收集了一堆面试题.其实刷面试题的过程也能更新自己对知识的认识,所以也提醒自己多看多理解.如果对下面题目有更深理解,会实时更新.遇到新题目,也会不定时更新.希望能帮助到部分朋友- ...