=> 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 中箭头函数使用总结 的相关文章

  • MailTo 从 Javascript

    我有一个链接按钮 用于从页面内容构建邮件 从 javascript 启动它而不打开空白窗口或干扰调用它的窗口的最佳方法是什么 function Email var sMailTo mailto var sBody var alSelecte
  • 如何在通过 .ajaxForm() 提交表单之前执行一些操作?

    我正在使用 ajaxForm 框架来发送我的数据 而无需重新加载我的页面 ReplayForm ajaxForm success function data alert Success 现在 我想在提交表单之前检查一些条件 如果条件为假 则
  • Angular UI select:从远程服务获取数据

    我正在使用角度用户界面选择 https github com angular ui ui select https github com angular ui ui select 我查看了演示的可用位置这个笨蛋 http plnkr co
  • 如何立即启动setInterval循环? [复制]

    这个问题在这里已经有答案了 在一个简单的setInterval setInterval function Do something every 9 seconds 9000 第一个动作将在 9 秒后发生 t 9s 如何强制循环立即执行第一个
  • jQuery输入文件点击方法和IE上拒绝访问

    我尝试仅使用一个按钮作为输入文件 它在 Firefox Chrome Safari 中工作正常 但在 IE 中不行 提交表单时我总是收到 访问被拒绝 的消息 代码 input file click 有真正的解决方法吗 我在谷歌上浪费了大约2
  • 此页面上的脚本导致 ie 运行缓慢

    问题就在标题中 IE 行为异常 并说有一个脚本运行缓慢 FF 和 Chrome 没有这个问题 我怎样才能找到问题所在 那个页面有很多JS 手动检查不是一个好主意 EDIT 这是我正在处理的一个项目的页面 但我需要一个工具来查找问题 End
  • 如果没有 /// 标签,TypeScript 的“将 JavaScript 输出合并到文件中”选项无法推断出正确的脚本顺序

    我正在开发一个使用 将 JavaScript 输出合并到文件中 选项的 TypeScript 解决方案 我经常引用另一个文件中定义的项目 例如 In MyBaseClass ts export class MyBaseClass In My
  • 当我多次调用 requestAnimationFrame 时会发生什么

    我的意思是一次调用多个具有相同功能的 requestAnimationFrame function Draw DoSomething function AFunc prepare something requestAnimationFram
  • ES6继承:使用`super`访问父类的属性

    JavaScript 的super关键字 当我在 Chrome Babel TypeScript 上运行代码时 得到了不同的结果 我的问题是哪个结果是正确的 规范的哪一部分定义了这种行为 下面的代码 class Point getX con
  • 模板中带有 ng-if 的 angularjs 指令

    我正在构建一个在模板内使用 ng if 的指令 奇怪的是 提供给链接函数的元素没有扩展ng if代码 它只是ng if的注释行 经过一番尝试 我发现通过将链接代码包装在 timeout 中似乎可以使其正常工作 但我想知道这是否不是正确的处理
  • Web组件中嵌套槽的内容不可见

    我有一个 Web 组件 它应该接受任意元素来包装其内容 虽然我可以在 Chrome 开发工具中看到插槽已正确分配 但 DOM 中什么也没有出现 以前有人见过这个问题吗 定义 class ExampleParent extends HTMLE
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • 呃!尝试将包发布到 npm 时出现 403

    我正在尝试将包发布到 npm 您可以在此处查看存储库 https github com biowaffeln mdx state https github com biowaffeln mdx state 我登录到 npmnpm login
  • 类中可以有生成器 getter 吗?

    我的意思是吸气剂是发电机 我相信这一切都是 ES6 也许像这样 class a get count let i 10 while i yield i let b new a for const i of b count console lo
  • 如何重复 ajax 请求,直到满足 RxJS Observable 的条件?

    我正在尝试重复请求 直到响应包含使用 RxJS 的数据 此时我想调用成功 或失败 处理程序 但我在使用 RxJS 时遇到了麻烦 这是我目前的方法 redux observable action observable mergeMap gt
  • Service Worker 与 Shared Worker

    Service Worker 和 Shared Worker 有什么区别 我什么时候应该使用 Service Worker 而不是 Shared Worker 反之亦然 Service Worker 具有共享 Worker 之外的附加功能
  • 摩纳哥:如何添加内联自动完成/代码建议?

    我找不到任何有关如何添加内联自动完成功能的示例 如下图所示 有人可以指导我如何在摩纳哥做到这一点吗 这可以在 v1 66 中启用 现在在 Insiders 中 The editor quickSuggestions设置现在接受内联为 配置值
  • 尝试使用 Javascript 解决对称差异

    我正在尝试找出对称的解决方案 使用 javascript 完成以下任务的差异 目标 接受未指定数量的数组作为参数 保留数组中数字的原始顺序 不删除单个数组中数字的重复项 删除数组中出现的重复项 因此 例如 如果输入是 1 1 2 6 2 3
  • PDF 在 Safari 中隐藏 Jquery Modal

    这是与我有关的事情this https stackoverflow com questions 24052681 pdf hide jquery modal in ie问题 在 IE 中 我在对话框中使用 iframe 解决了问题 所以它工
  • 如何在运行脚本之前提交活动单元格中所做的更改? (Google 表格/Google Apps 脚本)

    我正在使用 Google Apps 脚本在 Google 表格中创建提交表单 该表单位于一页上 提交内容被移至第二个隐藏页面 当用户填写表单后 他们按下提交页面上的按钮以激活脚本 我遇到的问题是 当用户填写最后一个单元格然后单击按钮时 输入

随机推荐

  • 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 箭头函数相当于 匿名函数 简化了函数的定义 语言的发展都是倾向于简洁 对人类友好的 减轻工作量的 就相当于我最钟