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

文章详细对比了箭头函数和普通函数的差异,包括写法、构造函数使用、this的指向、arguments对象、new.target属性以及call/apply/bind方法的影响。箭头函数简化了语法,但不适用于所有场景,特别是涉及this和构造函数的情况。
摘要由CSDN通过智能技术生成

区别大致有6点:

1:写法不一样
2:箭头函数不能作为构造函数使用
3:两者this的指向不同
4:箭头函数的arguments指向它的父级函数所在作用域的arguments
5:箭头函数没有new.target
6、 call()、apply()、bind()等方法不能改变箭头函数中this的指向

下边我们分别就以上六点用代码来进行说明:

1:写法不一样

//箭头函数
let fn = name => {
    console.log(name)
}
//普通函数
let fn2 = function(name) {
    console.log(name)
}

声明一个普通函数需要使用关键字function来完成,并且使用function既可以声明成一个具名函数也可以声明成一个匿名函数
声明一个箭头函数则只需要使用箭头就可以,无需使用关键字function,比普通函数声明更简洁。
箭头函数只能声明成匿名函数,但可以通过表达式的方式让箭头函数具名

2、箭头函数不能作为构造函数使用

由于箭头函数时没有自己的this,且this指向外层的执行环境,且不能改变指向,所以不能当做构造函数使用。

3、两者this的指向不同

箭头函数没有prototype 不会 创建自己的this, 所以它没有自己的this,它只会在自己作用域的上一层继承this。所以箭头函数中this的指向在它在定义时已经确定了,之后不会改变。

普通函数的this指向:

1、 普通函数的this指向的是它的调用者,谁调用这个this,this就指向谁,
2、如果没有调用者,那这个this就指向window
3、在严格模式下(设置“use strict”),this为undefined
4、我们可以使用call,apply,bind(ES5新增)去改变普通函数的this指向

4、箭头函数的arguments指向它的父级函数所在作用域的arguments

箭头函数没有自己的arguments对象。在箭头函数中访问arguments实际上获得的是它外层函数的arguments值。

普通函数:

在调用函数时,浏览器每次都会传递进两个隐含的参数:
1.函数的上下文对象 this
2.封装实参的对象 arguments

arguments 是一个类数组对象,它可以通过索引来操作数据,也可以获取长度。
arguments 代表的是实参。在调用函数时,我们所传递的实参都会在arguments 中保存。
arguments只在函数中使用

5、箭头函数没有new.target

什么是new.target

new.target允许你检测函数或构造方法是否是通过new运算符调用的,若函数或构造方法是由new调用的,则new.target属性的值指向该函数或构造函数,否则值为undefined。

普通函数调用中,new.target的值为undefined,使用new运算符调用的函数其值为函数本身,这可以用来判断一个函数是否是使用new调用的
ES6中的class类创建实例时必须使用new,new.target的值则为类定义本身
在类的继承中,new.target的值指向初始化类的类定义

箭头函数没有new.target
箭头函数不能被new执行,因为箭头函数没有this, 没有办法修改 this 的指向,所以也不可以将其作为构造函数、它也没有 prototype 对象。重点是没有prototype”

6、 call()、apply()、bind()等方法不能改变箭头函数中this的指向

箭头函数的this在声明时固定, 使用时不会变化, 因此call、apply、bind 不能改变箭头函数的this,因为箭头函数本身没有this
普通函数的this会在使用时变化,因此不存在这个问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值