JavaScript 箭头函数的特点、与普通函数的区别

 更新时间:2021年11月02日 09:00:48   作者:火星飞鸟  
这篇文章主要介绍了JavaScript 箭头函数的特点、与普通函数的区别,很多情况下,箭头函数和函数表达式创建的函数并无区别,只有写法上的不同,本文第二块内容将介绍箭头函数和普通函数功能上的区别,感兴趣的朋友跟随小编一起看看吧

1. 箭头函数的使用

ES6 中新增了使用箭头=>来定义函数表达式的方法。很多情况下,箭头函数和函数表达式创建的函数并无区别,只有写法上的不同。

本文第二块内容将介绍箭头函数和普通函数功能上的区别。

1. 普通函数到箭头函数

如下所示,定义一个函数,可以使用function关键字,函数接收两个参数ab,返回ab的和。

function getSum(a, b) {
    return a + b;
}

若使用箭头函数来定义这个函数,可以写成如下形式,省略function关键字,用箭头=>定义一个函数。

const getSum = (a, b) => {
    return a + b;
};

2. 省略大括号和 return

若定义的箭头函数,函数体内只有return语句,则可以省略大括号{}return

如下所示,定义的箭头函数,完整写法。

const getSum = (a, b) => {
    return a + b;
};

此箭头函数的函数体内只有return语句,那么,省略了大括号{}return后的精简写法如下:

const getSum = (a, b) => a + b;

3. 省略小括号

若定义的箭头函数,参数只有一个,则可以省略小括号。

如下所示,定义的箭头函数,只有一个参数,完整写法。

const func = (a) => {
    return a + 2;
};

省略了参数旁边的小括号,以下代码等价于上面的代码。

const func = a => a + 2;

注意:若函数没有参数,或者多个参数的情况下,必须要使用括号。

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

大多数情况下,能使用普通函数的地方都可以用箭头函数代替,因为箭头函数更精简。

但在部分情况下,箭头函数与普通函数有着很大的却别。

1. 箭头函数的 this 是父级作用域的 this

如下代码,定义了一个对象obj,对象中有个普通函数定义的方法getThis,打印出此处的this。调用obj.getThis(),会打印出obj对象。这说明方法内部的this指向对象obj

const obj = {
    name: 'Jack',
    getThis() {
        console.log(this);
    },
};
obj.getThis(); // {name: 'Jack', getThis: ƒ}

同样定义一个对象obj,但里面的方法用箭头函数定义,浏览器中调用obj.getThis()却打印出Window,这说明即使调用obj对象身上的方法,方法内部的this也不会指向obj,而是指向定义obj的上下文的this

const obj = {
    name: 'Jack',
    getThis: () => {
        console.log(this);
    },
};
obj.getThis(); // Window

2. call、apply、bind无法改变箭头函数的 this

如下代码,普通函数getName打印this.name,通过call将函数中的this绑定到obj身上,调用getName打印出obj身上的属性name

const obj = {
    name: 'Jack',
};

function getName() {
    console.log(this.name);
}
getName.call(obj); // Jack

若将函数改成箭头函数,那么call将不起作用,无法将函数内部的this绑定到obj,打印出undefined

const obj = {
    name: 'Jack',
};

const getName = () => {
    console.log(this.name);
};
getName.call(obj); // undefined

3. 不可以作为构造函数

箭头函数不可以作为构造函数使用,若将箭头函数作为构造函数,将报错,如下代码所示。

const Person = () => {
    this.name = 'Jack';
};
const usr = new Person(); // Person is not a constructor

4. 不可以使用 arguments

在普通函数内部,可以使用arguments来获取传入的参数,是一个类数组对象:

function func() {
    console.log(arguments);
}
func(1, 2, 3); // [Arguments] { '0': 1, '1': 2, '2': 3 }

而箭头函数就不可以使用arguments对象,获取不到输入的参数。

在浏览器中,若在箭头函数使用arguments对象,将报错。

const func = () => {
    // 浏览器环境
    console.log(arguments); // arguments is not defined
};
func(1, 2, 3);

但是箭头函数可以在参数内,以...args的方式,获取到输入的参数,得到的args是一个数组。

const func = (...args) => {
    console.log(args); // [ 1, 2, 3 ]
};
func(1, 2, 3);

5. 箭头函数不支持 new.target

普通函数定义的构造函数内部,支持使用new.target,返回构造实例的构造函数。

function Person() {
    this.name = 'Jack';
    console.log(new.target);
}
// 指向构造函数
new Person(); // [Function: Person]

而在箭头函数中,不支持使用new.target。在浏览器环境中,箭头函数使用new.target将报错:new.target expression is not allowed here

const Person=() =>{
    this.name = 'Jack';
    console.log(new.target);
}
// 浏览器环境
new Person(); // new.target expression is not allowed here

本文参考:

《JavaScript高级程序设计(第4版)》

到此这篇关于JavaScript 箭头函数的特点、与普通函数的区别的文章就介绍到这了,更多相关js箭头函数普通函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js中更短的 Array 类型转换

    js中更短的 Array 类型转换

    代码永远都是那么好玩,而 Trick 不断。那天张克军在 twitter 上说还有比 [].slice.call() 更短的 Array 转换么
    2011-10-10
  • javascript基本常用排序算法解析

    javascript基本常用排序算法解析

    这篇文章主要为大家详细介绍了javascript基本常用排序算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • ie8本地图片上传预览示例代码

    ie8本地图片上传预览示例代码

    ie8本地图片上传预览出现问题是因为限制浏览器造访本地文件,所以用到滤镜和div,下面有个不错的示例,希望对大家有所帮助
    2014-01-01
  • js实现图片点击左右轮播

    js实现图片点击左右轮播

    本文给大家分享的是使用javascript实现的图片左右轮播的代码,已经封装完毕,使用方法非常简单,参考示例,有需要的小伙伴可以参考下。
    2015-07-07
  • bootstrap里bootstrap动态加载下拉框的实例讲解

    bootstrap里bootstrap动态加载下拉框的实例讲解

    今天小编就为大家分享一篇bootstrap里bootstrap动态加载下拉框的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • layui 富文本图片上传接口与普通按钮 文件上传接口的例子

    layui 富文本图片上传接口与普通按钮 文件上传接口的例子

    今天小编就为大家分享一篇layui 富文本图片上传接口与普通按钮 文件上传接口的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • ECharts设置x轴刻度间隔的2种解决方法

    ECharts设置x轴刻度间隔的2种解决方法

    在初步接触Echarts时,经常遇到设置x轴刻度间隔的问题,这篇文章主要给大家介绍了关于ECharts设置x轴刻度间隔的2种解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • iframe如何动态创建及释放其所占内存

    iframe如何动态创建及释放其所占内存

    一个项目后期测试发现浏览器内存一直居高不下,而且打开iframe页面越多内存占用越大,在IE系列浏览器中尤其明显,下面与大家分享下iframe动态创建及释放内存
    2014-09-09
  • 简易的JS计算器实现代码

    简易的JS计算器实现代码

    这篇文章主要为大家详细介绍了JS简易的计算器实现代码,,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • JS实现弹出居中的模式窗口示例

    JS实现弹出居中的模式窗口示例

    这篇文章主要介绍了JS实现弹出居中的模式窗口,涉及javascript模式窗口及页面元素的动态操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06

最新评论