ES6——箭头函数

2023-11-04

1. ES6引入箭头函数的两大优点

①使代码更加简洁,从代码中去掉function、return和{ .. }节省了那些宝贵的键盘输入。

②改变this的行为特性,在箭头函数内部,this的绑定将不是动态的,而是词法的。在前面的代码中,如果使用箭头函数作为回调,this则如我们所愿是可预测的。

2. 使代码简洁

2.1 普通函数与箭头函数对比

//普通函数
function foo(x, y) {
    return x + y;
}
// 使用箭头
var foo = (x, y) => x + y;

2.2 几种不同形式的箭头函数

var f1 = () => 12;
var f2 = x => x * 2;
var f3 = (x, y) => {
    var z = x * 2 + y;
    y++;
    x *= 3;
    return (x + y + z) / 2;
};

①没参数时,箭头前要有小括号;

②单个参数,箭头前面直接写参数;

③多个参数,箭头前面,用小括号将多个参数包裹起来;

④箭头后面是单个表达式,则不用加{},也不用加return;

⑤箭头后面有多个表达式,则需要使用{}将多个表达式包裹起来,且加return

2.3 简洁与可读性的平衡

箭头函数转变带来的可读性提升与被转化函数的长度往往呈负相关。这个函数越长,=>带来的好处就越小;函数越短,=>带来的好处就越大。所以建议只在确实需要简短的在线函数表达式的时候才采用=>,而对于那些一般长度的函数则无需改变。

3. 改变this的行为特性

碰到事件监听时,你是不是也这样做:

var controller = {
    makeRequest: function(..){
        var self = this;
        btn.addEventListener( "click", function(){
        // ..
        self.makeRequest(..);
        }, false );
    }
};

使用箭头函数后,上述代码可改造为:

var controller = {
    makeRequest: function(..){
        btn.addEventListener( "click", () => {
        // ..
            this.makeRequest(..);
        }, false );
    }
};

此时,this的绑定是词法的,是从包围的作用域中词法继承而来的this,即箭头函数的this指向是父级程序的this指向。此处的父级是makeRequest函数,而makeRequest函数的this指向是controller对象,则this.makeRequest能引用到controller中的makeRequest函数。

注意:箭头函数的this指向是父级程序的this指向。如果用错可能会导致程序出错

var controller = {
    makeRequest: (..) => {
    // ..
        this.helper(..);
    },
    helper: (..) => {
        // ..
    }
};
controller.makeRequest(..);

此时,this.helper()找不到。原因是:父级程序的this指向全局作用域中this的指向,即为全局对象,在全局对象中没有helper方法。

4. 何时使用箭头函数

①如果你有一个简短单句在线函数表达式,其中唯一的语句是return某个计算出的值,且这个函数内部没有this引用,且没有自身引用(递归、事件绑定/解绑定),且不会要求函数执行这些,那么可以安全地把它重构为=>箭头函数。

② 如果你有一个内层函数表达式,依赖于在包含它的函数中调用var self = this hack或者.bind(this)来确保适当的this绑定,那么这个内层函数表达式应该可以安全地转换为=>箭头函数。

③所有的其他情况——函数声明、较长的多语句函数表达式、需要词法名称标识符(递归等)的函数,以及任何不符合以上几点特征的函数——一般都应该避免=>函数语法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES6——箭头函数 的相关文章

  • javascript 可以从父页面访问 iframe 元素吗?

    我的页面上有 iframe iframe 和父页面位于不同的域中 父页面上的 javascript 代码可以访问此 iframe 内的元素吗 如果页面来自不同的域 则不应该这样做 浏览器安全沙箱应该阻止这种类型的访问 当两个页面来自不同的时
  • 可以跨 iframe 共享 javascript 导入吗?

    我有一个 Web 应用程序 其中有多个 iframe 它们都需要导入相同的 javascript 库 例如 jquery 有没有办法只加载一次并以某种方式在所有 iframe 之间共享该数据 我不想让我的页面加载缓慢 因为它为每个 ifra
  • 如何在 Jasmine JS 中重用 beforeEach/afterEach?

    当使用 JasmineJS 编写测试时 我有许多具有类似 beforeEach afterEach 代码的测试 有没有办法使用 JasmineJS 测试套件实现继承模型 我可以将所有测试分组为一个describe但在这种情况下 我将以包含所
  • 计算两列中两个总和的平均值,并将其显示在 JQGrid 的下一列中

    I m using Jqgrid with summery row at grouping level Now I want to know one thing that Is it possible to show average cal
  • 获取访客的 Optimizely A/B 测试和变化

    当我在网站上运行实验时 我希望能够找出当前访问者看到的测试和变体 我无法找到如何做到这一点优化Javascript API https www optimizely com docs api 您可以获得第一个正在运行的实验的 ID 假设您有
  • 在 Javascript 中隐藏按钮

    在我最新的程序中 有一个按钮 单击时会显示一些输入弹出框 这些框消失后 如何隐藏按钮 You can set its visibility财产 http www w3schools com cssref pr class visibilit
  • html/js 中从右到左和/或从上到下的文本?

    如何在浏览器中为用户输入创建从右到左和从上到下的文本字段 有没有本地方法可以做到这一点 或者也许有解决方法 从上到下可能像日语或象形文字 对于 RTL 文本字段 您可以使用 HTMLdir属性 如 ime Vidas 已经提到的 或 wit
  • Javascript CORS 图像/画布操作

    我正在尝试从另一个已配置为允许 CORS 的域检索图像 并操纵像素 然后我想显示结果并能够操纵结果 我可以在我请求的图像上使用 getImageData 和 toDataURL 所以我知道服务器部分可以工作 但是 当我尝试将图像的 src
  • 发送带有图像的嵌套 JSON

    我一直在尝试研究一种能够通过 Ajax 将嵌套 JSON 请求发送回服务器的方法 根据我的理解 我们主要用于向服务器发送图像或文件的 formdata 在这种情况下不起作用 因为 FormData 似乎不处理嵌套对象 这就是我需要发送的有效
  • jQuery onclick 隐藏其父元素[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想隐藏 li tag on a 使
  • 从数组中删除空字符串,同时保持记录而不循环?

    这个问题在这里被问到 从数组中删除空字符串 同时保留非空字符串的索引记录 https stackoverflow com questions 18113243 remove empty strings from array while ke
  • 脚本不会从nodejs应用程序中的ejs文件运行

    我正在尝试使用nodejs express mysql和ejs让网页显示图表 但我显然不明白ejs javascript等是如何工作的 我需要运行一个脚本来设置图表 来自 Chart js 模块 但它不会输出任何类型的图表 我尝试过的 将
  • 抓取 Shopee API v4

    我有一个最终项目 其中我想要检索的数据是通过在shopee上抓取数据来获取的 但是当我在隐藏的API上抓取shopee时遇到问题 当我在Insomnia脚本上尝试时 脚本会运行 但是当我尝试时在本地或 google colab 脚本上 这是
  • 尝试将远程图像转换为 Base64 数据时出现 CORS 错误[重复]

    这个问题在这里已经有答案了 我需要将远程图像转换为给定其 URL 的 base64 但我遇到了 CORS 错误 并且不确定如何解决 我遵循了这个问题的一些解决方案 如何使用javascript将图像转换为base64字符串 https st
  • 过滤数据表中的行

    我目前的 JQuery 插件 DataTables 工作正常 并且我在页面顶部插入了一个按钮来进一步过滤列表 我还使用了 DataTables 内置的搜索栏 我希望按钮向下过滤表格 并只显示包含特定值的行 下面是我一直在做的事情 但似乎没有
  • 在 JavaScript/CoffeeScript 中确定一个数组是否包含另一个数组的内容

    在 JavaScript 中 如何测试一个数组是否包含另一个数组的元素 arr1 1 2 3 4 5 8 1 10 2 3 4 5 9 function name arr1 gt true 没有 set 函数可以执行此操作 但您可以简单地执
  • 汇总异常以保留模块

    我使用一个名为的汇总插件rollup plugin lit css转变 css文件转换成 javascript 模块 该插件非常简单 它本质上只是附加export default到文件 我的汇总配置使用preserveModules and
  • Javascript - HTML Canvas 上的 Gecko 边框半径自适应(CSS border-radius)

    我试图弄清楚如何将 border radius css 属性的行为重现到 HTML 画布中 所以我已经在 J avascript 中做了一些事情 以便使用特定的半径 对于每个角 来计算给定形状的正确边界 如果需要的话 这是上一个问题 Gec
  • Javascript - 通过键获取特定 JSON 数组元素内的属性值

    我有一个像这样的 JSON 结构 map key1 valueA1 key2 valueA2 key3 valueA3 key1 valueB1 key2 valueB2 key3 valueB3 key1 valueC1 key2 val
  • 将json数据从servlet传递到jsp到js文件

    我得到了这个创建 JSON 数据的 servlet 我想将此数据传递到一个 jsp 页面 该页面应该通过 InfoVis 工具包显示数据 servlet java JSONObject json new JSONObject JSONArr

随机推荐

  • 目前开源的智能家居服务器,Home Assistant(以下简称HA)是个开源的智能家

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Home Assistant 以下简称HA 是个开源的智能家居平台 开源意味着可以随便拿去用 而且是安全的 可以把家中的智能家居设备整合到HA中 它能够接入的设备非常的多 小米 博联 易微联 特
  • php 原生发邮件,原生php phpmailer 发送邮件 email

    setmail 查询最新可用的邮件 接受者 查询最新可用模板内容 查询最新可用企业邮箱 发送者 functionsetmail data username 24066 qq com data password ntpcbibe data f
  • UI自动化框架设计

    这个框架的话使用了PO分层思想和单用例设计模式然后使用Python selenium进行UI自动化框架设计 框架目录的结构 二 config包当中的config ini文件主要是用来存项目的绝对路径 是为了后续跑用例和生成测试报告做准备 然
  • Chrome浏览器的options参数

    options add argument headless 无头模式 options add argument window size x format width height 直接配置大小和set window size一样 optio
  • Linux:虚拟机配置免密登录和文件同步分发

    记录下 以后照抄就好了 文章目录 ssh免密登录 SCP安全拷贝 rsync同步修改 xsync集群分发 ssh免密登录 免密登录原理 生成公钥和私钥 ssh keygen t rsa后连敲三个回车 将公钥拷贝到要免密登录的目标机器上 遇到
  • 数据结构与算法期末复习总结

    为了方便复习 下面内容摘自 数据结构期末总结 夏日 blog CSDN博客 数据结构期末 目录 绪论 知识点 习题 线性表 知识点 习题 栈和队列 知识点 习题 串 数组和广义表 知识点 树和二叉树 知识点 习题 赫夫曼树及其应用 一步一步
  • R语言学习—添加回归模型拟合线(一)

    回归模型重要的基础或者方法就是回归分析 回归分析是研究一个变量 被解释变量 关于另一个 些 变量 解释变量 的具体依赖关系的计算方法和理论 是建模和分析数据的重要工具 常见的回归分析模型有 线性回归 逻辑回归 多项式回归 逐步回归 线性回归
  • OpenGL-GLSL语言入门教程(1)

    目录 GLSL简介 GLSL的内建变量 顶点着色器变量 gl PointSize gl VertexID 片段着色器变量 gl FragCoord gl FragDepth 参考网站 LearnOpenGL 参考书籍 OpenGL编程指南第
  • IOS 启动画面和图标设置(适配IOS7 and Xcode5)

    关于IOS程序设置启动画面以及图标的设备目前主要为 IPhone设备 和IPad设备 IPhone启动画面以及图标的设置 目前IPhone的分辨率为 320X480 640X960 640X1136 Default png 320X480
  • HTML DOM 利用下拉框实现网页跳转

  • C语言 结构体

    1什么是结构体 结构体是一种集合 它里面包含了多个变量或数组 它们的类型可以相同 也可以不同 每个这样的变量或数组都称为结构体的成员 结构的成员可以是标量 数组 指针 甚至是其他结构体 2结构体的定义 1 定义结构体的一般格式 struct
  • Kotlin入门-没有分号是个有趣的事情

    前言 第一眼看Kotlin的示例代码 突然发现没有分号 这个事情就值得商榷了 看两个范例 范例一 fun sum a Int b Int Int Int 参数 返回值 Int return a b 范例二 fun sum a Int b I
  • Acwing-对称的二叉树

    除了根节点都有一个性质 自己对应的节点是相同的 并且左右儿子 左右和右左分别对称 即根节点的左右两棵子树 每一棵都是左右对称的 Definition for a binary tree node struct TreeNode int va
  • 后台管理系统UI作品

    最近整理完成一个基于layUI的后台管理系统UI 分享交流 有兴趣的留言哈 演示地址 http roywu888 gitee io git
  • html使用ajax实现文件分片上传

    在实用中 经常有上传文件的操作 但是上传的文件有时会很大 所以需要将文件分片 然后一片一片上传到后台 其实前端写法跟普通的文件上传没有区别 只是需要把文件切割一下就好了 下面是一个例子 代码 结果 js部分 获取文件后就开始分片上传 有两个
  • ARIMA时间序列分析——(一)数据平稳性检验

    时间序列 指的是按时间顺序索引的一系列数据点 是面板数据的一种 属于一维面板数据 时间序列分析包括用于分析时间序列数据以及提取有意义的统计数据和数据其他特征的方法 ARIMA模型构建流程 1 判断模型的平稳度 2 差分法对非平稳时间序列进行
  • Java JDK 8的安装与配置

    文章目录 前言 1 安装JDK 8 Step1 选择JDK的版本 Step2 选择系统平台 Step3 下载安装包 Step4 开始安装 2 配置JDK 8 Step1 配置 环境变量path 前言 本教程是在Windows 64位平台上安
  • 解决:adb devices error protocol falut(no status)

    今天用Android Studio运行项目到模拟器时 出现错误提示 远程主机强制关闭了一个连接 用adb devices检查一下设备状态 结果意外发现报错 adb devices error protocol falut no status
  • C语言基础——二维数组、二级指针和数组指针

    目录 二维数组 定义方式 初始化 二维数组的理解 二级指针 数组指针 二维数组 定义方式 lt 数据类型 gt lt 数据名 gt 行号 列号 初始化 int a 3 2 0 所有数组元素均为0 int a 3 2 1 2 3 4 5 6
  • ES6——箭头函数

    1 ES6引入箭头函数的两大优点 使代码更加简洁 从代码中去掉function return和 节省了那些宝贵的键盘输入 改变this的行为特性 在箭头函数内部 this的绑定将不是动态的 而是词法的 在前面的代码中 如果使用箭头函数作为回