=> js 中箭头函数使用总结

2023-11-15

箭头函数感性认识

箭头函数 是在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; // 1990
        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; // 1990
        var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
        return fn();
    }
};
obj.getAge(); // 25

如果使用箭头函数,以前的那种hack写法 就不需要了:
var that = this;

由于this 在箭头函数中已经按照词法作用域绑定了, 所以施一公call 或者apply() 调用函数的时候, 无法对this 进行绑定, 即 传入的第一个参数被忽略:

var obj={
    birth:2018,
    getAge:function(year){
    var b =this.birth;//2018
    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);
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

=> js 中箭头函数使用总结 的相关文章

随机推荐

  • html在网页上显示不出,WKWebView 加载本地HTML显示不出网页问题,这点你注意了吗?-------完美显示...

    1 首先 WKWebView的引入和创建 我这里就不做阐述 我要说的 就是解决别人不能给您解决的问题 2 WKWebView 加载本地HTML 也就是两三句代码 是吧 作为读者的您肯定也知道 也实现了 就是如下代码 这里要说一下 为了做到正
  • Windows安装mysql服务

    Windows上同时安装两个mysql服务 一 下载两个版本的MySQL 进入官网下载 https www mysql com 二 将下载下来的压缩包放到合适的位置并且解压缩 2 1配置环境变量 2 2创建my ini文件 mysql 设置
  • AWS SAA-C03 #36

    A company is building an application in the AWS Cloud The application will store data in Amazon S3 buckets in two AWS Re
  • 前端第三方组件库官网

    前端第三方组件库官网 Vant Weapp 官网 https vant contrib gitee io vant weapp home Vant ui 官网 https vant contrib gitee io vant zh CN r
  • 面试官问你为什么离开上一家公司该怎么回答?

    相关文章 程序员面试必问 你为什么要离开上一家公司 你会怎么回答 面试官问你为什么离开上一家公司该怎么回答 是否被HR问过 你为什么离开上一家公司 总结 没有晋升空间 想找一个更大的舞台 上家公司的工作量不饱和 团队气氛不足 我是一个习惯加
  • 在VS2010进行MFC编程设置字符集的问题(使用多字节字符集引起错误)

    1 error C2664 WideCharToMultiByte 不能将参数 3 从 CString 转换为 LPC WSTR 参数3是m edit 2 error C2039 GetWindowTextW 不是 CComboBox 的成
  • moviepy音视频开发:音频剪辑基类AudioClip

    前往老猿Python博文目录 一 背景知识介绍 1 1 声音三要素 音调 人耳对声音高低的感觉称为音调 也叫音频 音调主要与声波的频率有关 声波的频率高 则音调也高 音量 也就是响度 人耳对声音强弱的主观感觉称为响度 响度和声波振动的幅度有
  • 时间序列分析和预测(含实例及代码)

    导论 研究时间序列主要目的 进行预测 根据已有的时间序列数据预测未来的变化 时间序列预测关键 确定已有的时间序列的变化模式 并假定这种模式会延续到未来 时间序列预测法的基本特点 假设事物发展趋势会延伸到未来 预测所依据的数据具有不规则性 不
  • C#窗体调用地图(高德地图)-实现公交线路查询

    C 窗体调用地图 高德地图 实现公交线路查询 新建C 工程 创建Windows窗体应用程序 添加WebBrowser控件 用来显示网地图页 可以把滚动条 ScrollBarsEnabled 设置成false给取消掉 更加的美观方便 使用高德
  • 刷脸支付成为下一个主流我们拭目以待

    智能刷脸支付已成为2019支付生态的风口 对于超市 便利店 企事业单位 停车场 餐厅等所有支付场景 越早加入刷脸支付 将享受越多的风口红利 刷脸支付 智慧医疗 智慧校园 智慧银行 餐饮超市酒店 无感停车场 各场景解决方案 软件定制开发 支付
  • 谷歌面试题解析: 扔鸡蛋的正确方式是什么?

    面试中 为了考察应聘者的思维方式 面试官偶尔会出一些谜题 Puzzles 比如 在谷歌 就有这样一道让人 闻风丧胆 的面试题 You work in a 100 floor building and you get 2 identical
  • 个人网站搭建记录

    个人网站地址 实际需要 云服务器 域名 网站备案 知识储备 node写一些后台接口 express mysql数据库 navicat连接数据库 mysql 常用终端命令行 https www jb51 net article 194140
  • hexo问题及解决

    1 推荐主题 butterfly 的默认 layout 很好 尤其对于内容比较多的 blog 安装方法如下 npm install hexo renderer pug hexo renderer stylus save npm instal
  • QMessageBox、QColorDialog、按钮汉化显示

    QMessageBox QColorDialog 按钮汉化显示 版本 Qt5 9 9 环境 QtCretator MinGW 在Qt源码目录下找到qt zh CN ts复制一份到工程目录 该文件在 G install Qt Qt5 9 9
  • 图像仿射变换shear怎么翻译?剪切、错切、推移哪个译词好?

    老猿Python博文目录 https blog csdn net LaoYuanPython 仿射变换博文传送门 带星号的为付费专栏文章 图像仿射变换原理1 齐次坐标来龙去脉详解 图像仿射变换原理2 矩阵变换 线性变换和图像线性变换矩阵 图
  • 关于CASE WHEN造成的查询缓慢的生产问题思考

    因为做的是类似SAAS的系统 关于同一个业务没会有不同的视角 有管理员 有类别分类的 有特别逻辑处理的 总而言之涉及到很多方面 再加上历史遗留问题导致导致的数据问题 这SQL写起来真的酸爽 除了简单的关联 还要考虑到一个效率问题 最近就因为
  • 搜索引擎的发展历史

    第一代搜索引擎 分类目录时代 分类目录时代的的搜索引擎会收集互联网上各个网站的站名 网址 内容提要等信息 并将它们分门别类的编排到一个网站中 用户可以在分类目录中逐级浏览并寻找相关的网站 搜狐目录 hao123等就是典型的分类目录时代的代表
  • 如何在数据库事务提交成功后进行异步操作

    原文链接 问题 业务场景 业务需求上经常会有一些边缘操作 比如主流程操作A 用户报名课程操作入库 边缘操作B 发送邮件或短信通知 业务要求 操作A操作数据库失败后 事务回滚 那么操作B不能执行 失败后也可以重新进行自调度 操作A执行成功后
  • css3学习以及移动端开发基本概念的思考

    html height 1000px background color red media screen and width 2560px html background color blue 注意 首先必须弄清楚 我们的width hei
  • => js 中箭头函数使用总结

    箭头函数感性认识 箭头函数 是在es6 中添加的一种规范 x gt x x 相当于 function x return x x 箭头函数相当于 匿名函数 简化了函数的定义 语言的发展都是倾向于简洁 对人类友好的 减轻工作量的 就相当于我最钟