JS箭头函数和常规函数之间的区别实例分析【 5 个区别】

yizhihongxing

下面是详细的讲解。

什么是箭头函数

箭头函数是ECMAScript 6中新增的一种语法,用于定义函数。箭头函数相比常规函数,语法更加简洁,同时还有一些不同之处。箭头函数的语法如下:

(param1, param2, …, paramN) => { statements }

其中,param1, param2, …, paramN表示函数的参数列表,statements表示在函数中要执行的语句。

常规函数和箭头函数之间的区别

下面介绍常规函数和箭头函数之间5个不同之处。

1. 箭头函数不能使用arguments对象

在常规函数中,我们可以使用arguments对象来获取传入的参数。但是,在箭头函数中,不能使用arguments对象。这是因为箭头函数没有自己的this值,而arguments对象和this值都是在函数被调用时运行时创建的,因此在箭头函数中无法使用arguments对象。

function foo() {
    console.log(arguments);
}
foo(1, 2, 3);  // 输出: [1, 2, 3]

const bar = () => {
    console.log(arguments);
}
bar(1, 2, 3);  // 报错:arguments is not defined

2. 箭头函数的this值

常规函数中的this值是在函数运行时确定的,取决于函数的调用方式。而箭头函数中的this值是在函数定义时确定的,它指向函数所在上下文的this值。

const obj = {
    name: 'Tom',
    sayHi: function() {
        console.log("Hi, I'm", this.name);
    },
    sayHiArrow: () => {
        console.log("Hi, I'm", this.name);
    }
}

obj.sayHi();         // Hi, I'm Tom
obj.sayHiArrow();    // Hi, I'm undefined

3. 箭头函数无法绑定this

在常规函数中,我们可以使用bindcallapply等方法来显式绑定this值。但是,在箭头函数中,无法使用这些方法来修改this值,因为箭头函数的this值已经在函数定义时被确定了。

const obj = {
    name: 'Tom',
    sayHi: function() {
        console.log("Hi, I'm", this.name);
    },
    sayHiArrow: () => {
        console.log("Hi, I'm", this.name);
    }
}

const otherObj = {
    name: 'Jack'
}

const sayHi = obj.sayHi.bind(otherObj);
const sayHiArrow = obj.sayHiArrow.bind(otherObj);

sayHi();         // Hi, I'm Jack
sayHiArrow();    // Hi, I'm undefined

4. 箭头函数没有原型

在常规函数中,每个函数都有一个原型对象,该对象上有一些方法和属性。而在箭头函数中,没有原型对象。

function foo() {}
const bar = () => {}

console.log(foo.prototype);  // {}
console.log(bar.prototype);  // undefined

5. 箭头函数不支持yield关键字

yield关键字用于生成器函数中,用于控制生成器函数的执行流程。而箭头函数不支持yield关键字,因此不能用于生成器函数。

function* generator() {
    yield 1;
    yield 2;
}

const generatorArrow = () => {
    yield 1;   // 报错:SyntaxError: Unexpected keyword 'yield'
    yield 2;
}

示例说明

下面的两个示例都是通过比较常规函数和箭头函数的区别来进行解释的。

示例一

function getSalary(salary, tax) {
    return salary - salary * tax;
}

const getSalaryArrow = (salary, tax) => salary - salary * tax;

console.log(getSalary(10000, 0.2));          // 输出: 8000
console.log(getSalaryArrow(10000, 0.2));     // 输出: 8000

上面的示例中,常规函数getSalary和箭头函数getSalaryArrow的功能都是计算税后工资。通过比较可以发现,箭头函数的语法更加简洁。

示例二

function Counter() {
    this.count = 0;
    setInterval(function() {
        this.count++;
        console.log(this.count);
    }, 1000);
}

const counter = new Counter();

上面的示例中,Counter是一个构造函数,它会在每一秒钟增加计数器的值并输出。但是,由于在匿名函数中使用了this关键字,而在匿名函数执行时上下文已经改变,因此会出现计数器不变的情况。为了解决这个问题,我们可以使用箭头函数来绑定this值。

function Counter() {
    this.count = 0;
    setInterval(() => {
        this.count++;
        console.log(this.count);
    }, 1000);
}

const counter = new Counter();

上面的示例中,箭头函数setInterval(() => {...})中的this值指向了Counter函数的实例对象,因此可以正常执行计数器加1的操作。

至此,关于“JS箭头函数和常规函数之间的区别实例分析【 5 个区别】”的完整攻略就讲解完了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS箭头函数和常规函数之间的区别实例分析【 5 个区别】 - Python技术站

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

相关文章

  • javascript prototype 原型链

    JavaScript 中的每一个对象都有一个指向另一个对象的内部链接,这个链接称为原型(prototype)链。如果一个对象需要一个属性或者方法,但是它本身并没有这个属性或方法,它会沿着自身的原型链向上查找,直到找到该属性或方法为止。 原型链的概念 每一个 JavaScript 对象在创建时,都会与一个 “原型” 关联起来,这个原型可以是其他的对象的实例,这…

    JavaScript 2023年6月10日
    00
  • JS操作JSON常用方法(10w阅读)

    JS操作JSON常用方法攻略 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其基于JavaScript语言的子集,易于人阅读和编写,同时也易于机器解析和生成。 JSON格式的数据由键值对组成,键值对之间使用英文半角逗号(,)分隔,最外层用一对大括号({})包裹,每个键值对由一个键和一个值组成,键…

    JavaScript 2023年5月27日
    00
  • element-ui中导航组件menu的一个属性:default-active说明

    Element UI 是一款基于 Vue 2.0 的桌面端组件库,在其中导航组件 menu 是常用的菜单导航组件之一。该组件有一个属性:default-active,本文将详细讲解该属性。 属性说明 首先,我们来看该属性的官方说明。 default-active 属性可以用来设置默认激活的菜单项,它接收一个字符串类型的 index 值,默认值为 ”。 该属…

    JavaScript 2023年6月10日
    00
  • JSON.parse处理非标准Json数据出错的解决

    当我们使用JSON.parse()解析JSON格式的数据时,如果数据格式非标准的话,就有可能会出现报错现象。 例如我们有一个非标准的JSON格式数据如下: { name: "Tom", age: 28 } 使用JSON.parse()时会报错,错误信息如下: Uncaught SyntaxError: Unexpected token n…

    JavaScript 2023年5月27日
    00
  • 详解如何在JavaScript中使用装饰器

    下面我会详细介绍如何在JavaScript中使用装饰器,以及两条相关的示例说明。 什么是装饰器? 装饰器是一种特殊的函数,可以修改类、方法或属性的行为,并且可以在不改变它们原始代码的情况下实现这些修改。 装饰器源自于 Python 语言,最近已被加入 ECMAScript 标准中并成为 ES2017 的一部分,原生支持。 如何使用装饰器? 在 JavaScr…

    JavaScript 2023年6月11日
    00
  • React-Native之定时器Timer的实现代码

    下面是关于“React-Native之定时器Timer的实现代码”的完整攻略: 什么是定时器? 在React-Native中,我们可以使用定时器来处理一些需要在指定时间间隔内执行的任务。React-Native提供了两种类型的定时器:基于时间间隔的定时器和基于帧率的定时器。此处我们重点讲解基于时间间隔的定时器。 基于时间间隔的定时器用法 React-Nati…

    JavaScript 2023年6月11日
    00
  • js判断浏览器类型,版本的代码(附多个实例代码)

    当我们开发web应用程序时,我们常常需要检测用户的浏览器类型和版本,以确保网站的功能在不同浏览器上的兼容性。以下是检测浏览器类型,版本的Javascript代码的攻略。 一、通过userAgent检测 Javascript可以通过navigator.userAgent来获取浏览器的用户代理字符串,然后从中提取浏览器类型和版本号。 let userAgent …

    JavaScript 2023年6月11日
    00
  • js将long日期格式转换为标准日期格式实现思路

    将long日期格式转换为标准日期格式,可以按照以下步骤进行操作: 获取long日期值 首先,我们需要获取包含long日期值的变量,可以是从数据库中查询到的时间戳,或者是前端传递过来的时间戳等。 示例1:获取当前时间戳 var timestamp = Date.now(); 示例2:获取后端传递过来的时间戳 var timestamp = response.d…

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