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

es6箭头函数和普通函数的区别 在JavaScript中,函数是执行特定任务的代码块。函数可以被定义并且随后被调用。JavaScript中有两种主要的函数定义方式:普通函数声明和箭头函数表达式。 阅读详情

一、基本语法

ES6中允许使用箭头=>来定义箭头函数,具体语法,我们来看一个简单的例子:

// 箭头函数
let fun = (name) => {
    // 函数体
    return `Hello ${name} !`;
};

// 等同于
let fun = function (name) {
    // 函数体
    return `Hello ${name} !`;
};

可以看出,定义箭头函在数语法上要比普通函数简洁得多。箭头函数省去了function关键字,采用箭头=>来定义函数。函数的参数放在=>前面的括号中,函数体跟在=>后的花括号中。

关于箭头函数的参数:

① 如果箭头函数没有参数,直接写一个空括号即可。

② 如果箭头函数的参数只有一个,也可以省去包裹参数的括号。

③ 如果箭头函数有多个参数,将参数依次用逗号(,)分隔,包裹在括号中即可。

// 没有参数
let fun1 = () => {
    console.log(111);
};

// 只有一个参数,可以省去参数括号
let fun2 = name => {
    console.log(`Hello ${name} !`)
};

// 有多个参数
let fun3 = (val1, val2, val3) => {
    return [val1, val2, val3];
};

关于箭头函数的函数体:

①如果箭头函数的函数体只有一句代码,就是简单返回某个变量或者返回一个简单的JS表达式,可以省去函数体的大括号{ }。

let f = val => val;
// 等同于
let f = function (val) { return val };

let sum = (num1, num2) => num1 + num2;
// 等同于
let sum = function(num1, num2) {
  return num1 + num2;
};

②如果箭头函数的函数体只有一句代码,就是返回一个对象,可以像下面这样写:

// 用小括号包裹要返回的对象,不报错
let getTempItem = id => ({ id: id, name: "Temp" });

// 但绝不能这样写,会报错。
// 因为对象的大括号会被解释为函数体的大括号
let getTempItem = id => { id: id, name: "Temp" };

③如果箭头函数的函数体只有一条语句并且不需要返回值(最常见是调用一个函数),可以给这条语句前面加一个void关键字

let fn = () => void doesNotReturn();

箭头函数最常见的用处就是简化回调函数。

// 例子一
// 正常函数写法
[1,2,3].map(function (x) {
  return x * x;
});

// 箭头函数写法
[1,2,3].map(x => x * x);

// 例子二
// 正常函数写法
var result = [2, 5, 1, 4, 3].sort(function (a, b) {
  return a - b;
});

// 箭头函数写法
var result = [2, 5, 1, 4, 3].sort((a, b) => a - b);

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

1、语法更加简洁、清晰

从上面的基本语法示例中可以看出,箭头函数的定义要比普通函数定义简洁、清晰得多,很快捷。

2、箭头函数不会创建自己的this(重要!!深入理解!!)

我们先来看看MDN上对箭头函数this的解释。

箭头函数不会创建自己的this,所以它没有自己的this,它只会从自己的作用域链的上一层继承this。

箭头函数没有自己的this,它会捕获自己在定义时(注意,是定义时,不是调用时)所处的外层执行环境的this,并继承这个this值。所以,箭头函数中this的指向在它被定义的时候就已经确定了,之后永远不会改变。

来看个例子:

var id = 'Global';

function fun1() {
    // setTimeout中使用普通函数
    setTimeout(function(){
        console.log(this.id);
    }, 2000);
}

function fun2() {
    // setTimeout中使用箭头函数
    setTimeout(() => {
        console.log(this.id);
    }, 2000)
}

fun1.call({id: 'Obj'});     // 'Global'

fun2.call({id: 'Obj'});     // 'Obj'

上面这个例子,函数fun1中的setTimeout中使用普通函数,2秒后函数执行时,这时函数其实是在全局作用域执行的,所以this指向Window对象,this.id就指向全局变量id,所以输出'Global'。
但是函数fun2中的setTimeout中使用的是箭头函数,这个箭头函数的this在定义时就确定了,它继承了它外层fun2的执行环境中的this,而fun2调用时this被call方法改变到了对象{id: 'Obj'}中,所以输出'Obj'。


再来看另一个例子:

var id = 'GLOBAL';
var obj = {
  id: 'OBJ',
  a: function(){
    console.log(this.id);
  },
  b: () => {
    console.log(this.id);
  }
};

obj.a();    // 'OBJ'
obj.b();    // 'GLOBAL'

上面这个例子,对象obj的方法a使用普通函数定义的,普通函数作为对象的方法调用时,this指向它所属的对象。所以,this.id就是obj.id,所以输出'OBJ'。
但是方法b是使用箭头函数定义的,箭头函数中的this实际是继承的它定义时所处的全局执行环境中的this,所以指向Window对象,所以输出'GLOBAL'。(这里要注意,定义对象的大括号{}是无法形成一个单独的执行环境的,它依旧是处于全局执行环境中!!)


3、箭头函数继承而来的this指向永远不变(重要!!深入理解!!)

上面的例子,就完全可以说明箭头函数继承而来的this指向永远不变。对象obj的方法b是使用箭头函数定义的,这个函数中的this就永远指向它定义时所处的全局执行环境中的this,即便这个函数是作为对象obj的方法调用,this依旧指向Window对象。

4、.call()/.apply()/.bind()无法改变箭头函数中this的指向

.call()/.apply()/.bind()方法可以用来动态修改函数执行时this的指向,但由于箭头函数的this定义时就已经确定且永远不会改变。所以使用这些方法永远也改变不了箭头函数this的指向,虽然这么做代码不会报错。

var id = 'Global';
// 箭头函数定义在全局作用域
let fun1 = () => {
    console.log(this.id)
};

fun1();     // 'Global'
// this的指向不会改变,永远指向Window对象
fun1.call({id: 'Obj'});     // 'Global'
fun1.apply({id: 'Obj'});    // 'Global'
fun1.bind({id: 'Obj'})();   // 'Global'

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

我们先了解一下构造函数的new都做了些什么?简单来说,分为四步:

① JS内部首先会先生成一个对象;

② 再把函数中的this指向该对象;

③ 然后执行构造函数中的语句;

④ 最终返回该对象实例。

但是!!因为箭头函数没有自己的this,它的this其实是继承了外层执行环境中的this,且this指向永远不会随在哪里调用、被谁调用而改变,所以箭头函数不能作为构造函数使用,或者说构造函数不能定义成箭头函数,否则用new调用时会报错!

let Fun = (name, age) => {
    this.name = name;
    this.age = age;
};

// 报错
let p = new Fun('cao', 24);

6、箭头函数没有自己的arguments

箭头函数没有自己的arguments对象。在箭头函数中访问arguments实际上获得的是外层局部(函数)执行环境中的值。

// 例子一
let fun = (val) => {
    console.log(val);   // 111
    // 下面一行会报错
    // Uncaught ReferenceError: arguments is not defined
    // 因为外层全局环境没有arguments对象
    console.log(arguments); 
};
fun(111);

// 例子二
function outer(val1, val2) {
    let argOut = arguments;
    console.log(argOut);    // ①
    let fun = () => {
        let argIn = arguments;
        console.log(argIn);     // ②
        console.log(argOut === argIn);  // ③
    };
    fun();
}
outer(111, 222);

上面例子二,①②③处的输出结果如下:

很明显,普通函数outer内部的箭头函数fun中的arguments对象,其实是沿作用域链向上访问的外层outer函数的arguments对象。

可以在箭头函数中使用rest参数代替arguments对象,来访问箭头函数的参数列表!!

7、箭头函数没有原型prototype

let sayHi = () => {
    console.log('Hello World !')
};
console.log(sayHi.prototype); // undefined

8、箭头函数不能用作Generator函数,不能使用yeild关键字

面试题6:ES6箭头函数与普通函数的区别 普通函数和箭头函数的区别: ………………………………………………………………………………………………………………………………………… 箭头函数的this指向规则: 1. 箭头函数没有prototype(原型),所以箭头函数本身没有this function test1 () { console.log(test1.prototype) } te... 阅读详情

相关推荐

ES6的箭头函数和普通函数相比有什么不同?

箭头函数适用于简单的函数定义和回调函数,对于需要使用 this 或 arguments 对象的情况,传统函数仍然更适合使用。箭头函数没有自己的 arguments 对象,无法通过 arguments 访问传入的参数列表。箭头函数没有自己的 this 值,它的 this 值继承自外部的词法作用域。这意味着在箭头函数内部,无法通过 this 访问到函数自身的上下文,而是使用外部作用域的 this 值。箭头函数使用箭头(=>)来定义函数,语法更加简洁明了,省略了传统函数中的 function 关键字和大括号。

祈澈菇凉 570

箭头函数

一、基本语法 ES6中允许使用箭头=>来定义箭头函数,具体语法,我们来看一个简单的例子: // 箭头函数 let fun = (name) => { // 函数体 return `Hello ${name} !`; }; // 等同于 let fun = function (name) { // 函数体 return `Hello ${name} !`...

编程之路 5208

vue+element-ui+ajax实现一个表格的实例

下面小编就为大家分享一篇vue+element-ui+ajax实现一个表格的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

【Vue】【杂碎】()=>和()=>{}的区别

但是,如果箭头函数体内有多行代码,那么就必须使用大括号括起来。需要注意的是,使用大括号的函数体和不使用大括号的函数体之间还有一个重要的区别。具体来说,使用大括号的函数体中的。如果箭头函数体内只有一行代码,那么可以省略大括号。关键字指向的是这个箭头函数本身,而不是定义它的对象。因此我们可以省略大括号,并且可以直接使用这个箭头函数来计算加法。的函数体包含了多行代码,所以我们必须使用大括号并手动返回结果。大括号的写法,另一种是不带大括号的写法。上面的代码中,箭头函数。上面的代码中,箭头函数。

qq_25218219的博客 3743

手势控制 Python !Leap Motion Python 开发教程 (二)

手势控制 Python !Leap Motion Python 开发教程 (二) 现在进入正题,我来给大家总结一下我在使用 Leap Motion 开发过程中的经验以及学到的东西,其中我会概括以及翻译官方给出的注释,为了让这些注释更加通俗易懂,让大家更好理解。 回顾 在上一篇文章中我们讲了如何配置 Leap Motion 的 Python 2.7 的开发环境,如果您还没有配置好您的开发环境,可以参...

成畅的博客 3194

jaka+realsense+aruco+手眼标定(python)

第二次重建了项目的手眼标定部分……有很多第一次记录遗漏的地方,在此补充。

drivenzyw的博客 2122

箭头函数详解()=>{}

摘要:箭头函数有几个使用注意点。 (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象,箭头函数继承而来的this指向永远不变。 (2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。 (3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。 (4)不可以使用yield命令,因此箭头函数不能用...

weixin_30685029的博客 1万+

MC33PT2000控制详解一:PT2000 Dev Studio工具的使用

MC33PT2000共可控制6个高低端(如控制6个高压喷油器),1个高低端(如控制高压油泵)和DC-DC模块(如升压到65V).

m0_69929716的博客 1359

ES6 箭头函数与普通函数的区别:全面透彻分析

ES6 箭头函数与普通函数的区别:全面透彻分析

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 7169

Java中使用工厂模式和策略模式优雅消除if-else语句(UML类图+案例分析)

在最近的后端开发中,多多少少会发现有很多if-else语句,如果条件过多则会造成整体代码看起来非常臃肿。本篇博客汇总了我对工厂模式和策略模式的理解,以及我是如何把它们巧妙运用在实际项目当中的一些技巧进行了分享,如有问题,欢迎评论区讨论!

黄团团的个人博客 2613

【Unity实战篇】 接入百度翻译,实现文本自动翻译功能

日常在做项目的过程中,游戏本地化几乎已经成为必不可少的一步。 本篇文章将演示怎样在Unity中接入百度翻译,实现文本自动翻译的功能。

努力前行,总会成为自己心中的那道光 9060

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

箭头函数与普通函数的区别 作为ES6中新加入的箭头函数语法,深受广大开发人员的喜爱,也是平时前端面试过程中经常会被提及问道的典型题目。它不仅简化了我们的代码,而且也让开发人员摆脱了“飘忽不定”的this指向,本文就箭头函数与普通函数的区别进行一些分析。 在我看来,面试官最关注的也是两者最关键的区别就是this指向的区别,普通函数中的this指向函数被调用的对象,因此对于不同的调用者,this的...

yushang的博客 2509

基于Proximal Policy Optimization的无人机姿态控制系统的研究及Matlab实现

本文简要介绍了基于Proximal Policy Optimization算法的无人机姿态控制系统,并使用Matlab实现了一个简化版的代码。PPO算法的特点在于能够解决强化学习中的部分可观察性问题,同时还能保持策略网络更新的稳定性。本文将介绍基于Proximal Policy Optimization(PPO)算法的无人机姿态控制系统,并使用Matlab进行简化版实现。无人机姿态控制是指通过调整飞行器各部件的参数,使其保持特定角度、方向和位置的状态。本文将实现无人机的横滚姿态控制,并将其作为实现的示例。

m0_47037246的博客 716

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

箭头函数是ES6中新增的一种函数类型,它具有许多特性和优点。与普通函数相比,箭头函数具有更短的语法、更简洁的代码、更清晰的上下文、更简单的this绑定和更好的性能。然而,箭头函数也有一些限制和缺点,例如不能作为构造函数、没有arguments对象、不能使用yield关键字和无法访问arguments.callee和new.target等。在实际编程中,需要根据具体情况选择使用箭头函数或普通函数。

tyxjolin的专栏 1711

【爬虫实战】Instagram博主图片爬取:模拟登录+滚动加载,轻松抓取高清美图

在当今社交媒体时代,Instagram作为全球最受欢迎的图片分享平台之一,汇聚了无数优质博主的海量精美图片。对于数据爱好者、营销分析师、AI训练数据收集者来说,如何高效、稳定地爬取Instagram博主的图片,成为了一项极具实用价值的技术挑战。然而,Instagram的反爬机制日益严格,传统的静态页面请求已经无法满足需求。本文将带你从零开始,使用2024-2025年最新技术栈,实现模拟登录、滚动加载、高清图片下载的全流程爬虫。✅ 全流程代码可直接运行✅ 模拟手机端请求绕过反爬。

2201_76125261的博客 598

51单片机+L298驱动步进电机+L297测速+LCD1602显示+按键调试+Proteus仿真

51单片机+L298驱动步进电机+L297测速+LCD1602显示+按键调试+Proteus仿真 *Proteus仿真 L298N是双H桥式驱动器。 L297是步进电机控制集成芯片(包括环形分配器),可产生四相驱动信号,应用于微处理机控制两相双极性和四相单极性步进电机。电动机可由半阶梯、正常和斩波驱动模式驱动,同时设于晶片内的PWM斩波线路容许以开关形式控制线路的电流。此器件只需要时钟、方向和模式输入信号。相位是由内部产生的,因此可减轻微处理机和程序设计的负担。 实例代码 /************

perseverance51博客 4585

8.ES6箭头函数与普通函数的区别

箭头函数与普通函数的区别 作为ES6中新加入的箭头函数语法,深受广大开发人员的喜爱,也是平时前端面试过程中经常会被提及问道的典型题目。它不仅简化了我们的代码,而且也让开发人员摆脱了“飘忽不定”的this指向,本文就箭头函数与普通函数的区别进行一些分析。 在我看来,面试官最关注的也是两者最关键的区别就是this指向的区别,普通函数中的this指向函数被调用的对象,因此...

扛麻袋的少年的博客 1645

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

es6的箭头函数与普通函数的区别,箭头函数的this通常指向哪里,箭头函数可以用作构造函数吗?

1. 箭头函数与普通函数的区别:- 语法更简洁;- `this` 绑定规则不同:箭头函数的 `this` 由外部作用域决定,而普通函数的 `this` 在调用时动态确定;- 箭头函数不能作为构造函数。2. 箭头函数的 `this`: 箭头函数的 `this` 总是指向其定义时的外部作用域,而不是调用时的上下文。3. 箭头函数能否作为构造函数:不能。箭头函数没有 `prototype`,因此不能使用 `new` 创建实例。

2202_75961842的博客 1219

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

面试常见问题:箭头函数与普通函数区别

m1009113872的博客 284

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

前言 最近在看 ES6 相关的文档,当讲解到箭头函数的时候,说了三个与普通函数的不同点,这里记录一番。 不同点 箭头函数的 this 指向定义时所在的对象 先来个普通函数的例子: var user = { name: 'demo', getInfo: function () { setTimeout(function () { console.log(this) }, 200) } } 再来一个箭头函数的例子: var us

IMJCW的博客 747

ES6-箭头函数、以及箭头函数和普通函数的区别

之前写项目的时候遇到函数中的this指向问题,最近总结了一些关于ES6中新增的箭头函数的用法以及与普通函数的区别。也欢迎大家随时指正、探讨!谢谢!

weixin_45290438的博客 275

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

ES6箭头函数与普通函数的区别 首先知道一下什么是箭头函数,箭头函数就是没有function关键字,而是一个类似箭头的函数: var a = ()=>{ return 1; } 相当于 function a(){ return 1; } 那么就来看一下他们的区别 箭头函数作为匿名函数,是不能作为构造函数的,不能使用new var B = ()=>{ value:1; } var b = new B(); //TypeError: B is not a constructor 箭

weixin_48458705的博客 267

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

普通函数在es5中就有了,箭头函数是es6中出现的函数形式,当然也可以继续用普通函数。 1、普通函数 let a=function(){ return 1+1 } let b=function(x){ return x } let c=function(a){ let x=5; return x+a } 2、箭头函数 更简短的函数 单条处理可以省略return和{大括号} 单个参数可以省略(小括号) let a=()=>1+1 let b=x=>x let c=(a)=>

m0_49016709的博客 510

es6中的箭头函数和普通函数有什么区别?

es6中的箭头函数和普通函数有什么区别? 1、普通函数的this总是指向他的调用者,箭头函数中没有自己的this,所以它的this指向其定义的环境,任何方法都改变不了他的this指向{call bind apply} 2、箭头函数没有自己的this所以不能用于构造函数,也没有原型对象,箭头函数不能作为构造函数,也没有原型对象,所以就不能用new,不然就会报错。 3、箭头函数不能使用yield命令,因此箭头函数不能用作Generator函数。 4、箭头函数不能使用arguments对象,该函数在函数体内不存

屈小康 688

【知识点】ES6箭头函数、箭头函数与普通函数的区别

文章出处:ES6 - 箭头函数、箭头函数与普通函数的区别 一、基本语法 ES6中允许使用箭头=>来定义箭头函数,具体语法,我们来看一个简单的例子: // 箭头函数 let fun = (name) => { // 函数体 return `Hello ${name} !`; }; // 等同于 let fun = function (name) { // 函数体 return `Hello ${name} !`; }; 可以看出,定义箭头函在数语.

很多时候犯错都是在不知情的情况下发生的 188
上一篇: JavaScript中Map和ForEach的区别
下一篇: 数组中some,every,reduce的用法
Sunshine_qqqqiu
博客等级 码龄5年 0粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值