一文带你玩转JavaScript的箭头函数

一文带你玩转JavaScript的箭头函数

什么是箭头函数?

箭头函数是ES6引入的一种新的函数声明语法,它可以让我们更简洁地书写函数,并且可以解决一些this指向上的问题。

箭头函数与普通函数的区别在于箭头函数没有自己的this,它的this是词法作用域中的this,即在定义箭头函数时所处的上下文中的this。

箭头函数的基本语法

箭头函数有两种语法:

  1. 不带参数的箭头函数

javascript
()=> {
// 函数体
}

  1. 带参数的箭头函数

javascript
(参数1, 参数2, ...) => {
// 函数体
}

多个参数之间用逗号分隔,参数和箭头之间不能有空格。

对于只有一个参数的箭头函数,可以省略参数周围的括号:

参数 => {
    // 函数体
}

箭头函数与普通函数的区别

箭头函数与普通函数的区别在于this的指向。普通函数中的this是动态的,它的指向取决于函数的调用方式,而箭头函数中的this是静态的,它的指向在定义函数时就已经确定了。

例如:

const obj = {
    name: '张三',
    sayName() {
        console.log(this); // 输出:{ name: '张三', sayName: [Function: sayName] }
        function inner() {
            console.log(this); // 输出:全局对象
        }
        inner();
    },
    sayNameWithArrow() {
        console.log(this); // 输出:{ name: '张三', sayNameWithArrow: [Function: sayNameWithArrow] }
        const inner = () => {
            console.log(this); // 输出:{ name: '张三', sayNameWithArrow: [Function: sayNameWithArrow] }
        }
        inner();
    }
};
obj.sayName();
obj.sayNameWithArrow();

从输出结果可以看出,普通函数中的this指向的是调用该函数的对象(即obj),而内部的普通函数inner中的this指向的是全局对象。而箭头函数中的this永远指向定义函数时所处的上下文,即上面的例子中的obj对象。

箭头函数的使用场景

  1. 简化回调函数的书写

箭头函数可以让我们更方便地书写回调函数,例如:

```javascript
const arr = [1, 2, 3, 4];

let newArr = arr.map(function(item) {
return item * 2;
});

// 使用箭头函数可以简化为:
let newArr = arr.map(item => item * 2);
```

  1. 解决this指向的问题

箭头函数可以解决在普通函数中this指向的问题,例如:

```javascript
const obj = {
name: '张三',
sayName() {
setTimeout(function() {
console.log(this.name); // 输出:undefined
}, 1000);

       setTimeout(() => {
           console.log(this.name); // 输出:张三
       }, 1000);
   }

};
obj.sayName();
```

在上面的例子中,由于setTimeout函数是在全局上下文中调用的,因此内部的普通函数this指向的是全局对象,而箭头函数中的this指向的是定义函数时的上下文,即obj对象。

示例说明

下面给出两个使用箭头函数的示例:

示例1:计算商品价格

const products = [
    {
        name: '手机',
        price: 1999,
        count: 2
    },
    {
        name: '电脑',
        price: 8999,
        count: 1
    },
    {
        name: '耳机',
        price: 399,
        count: 3
    }
];

const totalPrice1 = products.reduce(function(total, product) {
    return total + product.price * product.count;
}, 0);

const totalPrice2 = products.reduce((total, product) => total + product.price * product.count, 0);

console.log(totalPrice1); // 输出:23396
console.log(totalPrice2); // 输出:23396

在上面的示例中,我们使用reduce方法计算商品的总价,第一个参数是回调函数,第二个参数是初始值。在普通函数的回调函数中,我们使用了this指向,而在箭头函数中,直接使用了total和product,使代码更加简洁。

示例2:获取数组元素的长度

const arr = ['hello', 'world', ''];

const len1 = arr.map(function(item) {
    return item.length;
});

const len2 = arr.map(item => item.length);

console.log(len1); // 输出:[5, 5, 0]
console.log(len2); // 输出:[5, 5, 0]

在上面的示例中,我们使用map方法计算数组元素的长度,第一个参数是回调函数。在普通函数中,我们需要使用return来返回长度,而在箭头函数中,可以直接省略return关键字,使代码更加简洁。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你玩转JavaScript的箭头函数 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 使用微信小程序API,调用微信的各种内置能力。

    下面是使用微信小程序API,调用微信的各种内置能力的完整攻略: 确认需要调用的API 首先需要确认你需要调用哪些API来实现你的功能。在微信小程序官方文档中,有一份与“微信小程序API能力”相关的内容提供了详细文档,我们可以通过这份文档快速找到需要的API。 引入API 在需要使用API的页面或程序中,需要先引入对应的API。引入API的方法一般如下: co…

    JavaScript 2023年6月11日
    00
  • qiankun 找不到入口问题彻底解决

    那我来详细讲解如何解决 “qiankun 找不到入口问题”。 问题背景 qiankun 是一个前端微服务框架,可以实现不同应用之间的动态加载和通信。但是,在使用 qiankun 的过程中,有时会遇到 找不到应用入口 的问题,这会导致应用无法正确加载。 解决步骤 1. 确认应用路径是否正确 首先确认引用路径是否正确。在主应用中,qiankun 会在指定路径下查…

    JavaScript 2023年6月11日
    00
  • Javascript中async与await的捕捉错误详解

    Javascript中async与await的捕捉错误详解 异步编程 在Javascript中,异步编程常常用于处理一些耗时的操作,例如读取服务器数据、文件读取或者用户输入等。 常见的异步编程方法有: 回调函数 Promise async/await 在这三种方法中,回调函数是最早被广泛采用的一种方式,它的另一种形式是事件监听器。然而,回调函数很容易出现回调…

    JavaScript 2023年5月18日
    00
  • JavaScript日期对象(Date)基本用法示例

    来了解一下JavaScript日期对象(Date)的基本用法吧! 什么是JavaScript日期对象(Date) JavaScript日期对象(Date)是JavaScript内置对象,用于处理与日期和时间相关的信息。我们可以使用JavaScript日期对象(Date)来获取当前时间、日期、计算时间间隔、格式化日期时间等。 创建JavaScript日期对象(…

    JavaScript 2023年5月27日
    00
  • js中slice()方法的使用说明

    JS中slice()方法的使用说明 概述 在JavaScript中,slice()方法可以对字符串和数组进行截取操作,并返回一个新的字符串或数组。slice()方法接受两个参数,分别为起始位置和结束位置,如果不传入结束位置,则默认截取到字符串或数组的末尾。需要注意的是,slice()方法并不会修改原来的字符串或数组,而是返回截取后的新字符串或数组。 语法 字…

    JavaScript 2023年5月27日
    00
  • 自己动手写一个java版简单云相册

    如何自己动手写一个java版简单云相册? 在这个攻略中我们将使用Spring Boot和Thymeleaf模板引擎来搭建一个简单的云相册,允许用户上传并分享自己的照片。以下是该应用程序的主要功能: 用户可以在相册中上传自己的照片 用户可以查看所有已上传的照片 用户可以通过链接轻松共享照片 未登录的用户无法上传照片 接下来,让我们一起进行这个项目的实现吧。 第…

    JavaScript 2023年6月11日
    00
  • 常见JS验证脚本汇总

    “常见JS验证脚本汇总”是一篇介绍JavaScript验证脚本的文章。JavaScript验证脚本用来验证表单输入的内容是否符合预期,可以提高表单的准确性和安全性。以下是详细的攻略: 标题 介绍 在介绍JavaScript验证脚本之前,需要先了解HTML表单的基本结构和form元素的常见属性。 JavaScript验证脚本的基本结构 JavaScript验证…

    JavaScript 2023年6月10日
    00
  • 解决拦截器对ajax请求的拦截实例详解

    解决拦截器对ajax请求的拦截实例详解 在使用拦截器的过程中,我们可能会发现拦截器会对ajax请求进行拦截,导致请求无法正常发送。解决这个问题,我们可以在拦截器中对ajax请求进行特殊处理,使其顺利通过。 首先,我们可以在请求前判断当前请求是否是ajax请求,如果是,则向请求头中添加一个特殊参数,如下所示: import axios from ‘axios’…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部