当前位置: 首页 > news >正文

【ES6】箭头函数和普通函数的区别

它们之间的区别:
(1)箭头函数没有自己的this。
(2)不可以当作构造函数,不可以对箭头函数使用new命令,否则抛出错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
(4)不可以使用yield命令,箭头函数不能用作 Generator 函数。

下面结合代码来解析:第一点和第二点

1、不可以当作构造函数,也就是说,不可以对箭头函数使用new命令,否则会抛出一个错误

<script>
//箭头函数
let demo01 = ()=>{console.log("demo01");
}let demo01Fun =new demo01();</script>

输出结果:
在这里插入图片描述

<script>
//普通函数
function demo02(){console.log("demo02");
}let demo02Fun =new demo02();</script>

在这里插入图片描述

2、箭头函数没有自己的this对象
下面代码通过call函数给函数指定了this{id:42}

<script>function demo01() {//箭头函数setTimeout(() => {console.log('id:', this.id);}, 100);
}var id = 21;demo01.call({ id: 42 });</script>

输出结果:
在这里插入图片描述
但是同样是调call函数指定this{id:42},为何输出的却是全局中id= 21呢?

<script>//普通函数function demo02() {setTimeout(function () {console.log('id:', this.id);}, 100);}var id = 21;demo02.call({ id: 42 });</script>

在这里插入图片描述
下面给代码加上断点调试一下看看:

<script>//普通函数function demo02() {debugger;setTimeout(function () {debugger;console.log('id:', this.id);}, 100);}debugger;var id = 21;demo02.call({ id: 42 });
</script>

代码运行到第一个断点时,Global中存在id=21
在这里插入图片描述
代码运行到第二断点处,此时出现方法demo02的局部变量Local,this指向的是{id:42}
在这里插入图片描述
代码运行到定时器时,this指向的windows,id=21。
在这里插入图片描述
而定时器中是箭头函数的,这时this指向的{id:42},从这可以看出箭头函数继承了调用它时的this。
也就是:
它没有自己的this对象,内部的this就是定义时上层作用域中的this。也就是说,箭头函数内部的this指向是固定的,相比之下,普通函数的this指向是可变的。

箭头函数没有this,箭头函数的ES5等价写法如下:

// ES6
function foo() {setTimeout(() => {console.log('id:', this.id);}, 100);
}// ES5
function foo() {var _this = this;setTimeout(function () {console.log('id:', _this.id);}, 100);
}

思考题:
请问下面的t1、t2、t3分别输出什么?

function foo() {return () => {return () => {return () => {console.log('id:', this.id);};};};
}var f = foo.call({id: 1});var t1 = f.call({id: 2})()(); 
var t2 = f().call({id: 3})(); 
var t3 = f()().call({id: 4}); 
http://www.lryc.cn/news/129686.html

相关文章:

  • 【网络基础实战之路】VLAN技术在两个网段中的实际应用详解
  • 密码学学习笔记(十九):密码学关键术语的解释1
  • angular中如何定义一个全局组件?
  • HTTP与HTTPS的区别
  • JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践 | 京东云技术团队
  • 英伟达结构化剪枝工具Nvidia Apex Automatic Sparsity [ASP](1)——使用方法
  • 接口测试,负载测试,并发测试,压力测试区别
  • WebRTC +Signal + ICE
  • 循环内的try-catch 跟循环外的try-catch有什么不一样
  • C语言实现Java三大特性
  • GBU812-ASEMI新能源专用整流桥GBU812
  • 数据结构,线性表与线性结构关系,顺序表与顺序结构关系,线性表与顺序表关系
  • Bigemap Pro国产基础软件介绍——一款多源数据处理软件
  • 算法练习Day49|● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II
  • 【Android Framework (十二) 】- 智能硬件设备开发
  • 若依框架给字典字段新增color值,并且实现下拉列表选项进行颜色设置
  • JDK 8 升级 JDK 17 全流程教学指南
  • Docker 网络之 ipvlan 和 macvlan
  • 【Rust】Rust学习 第十三章Rust 中的函数式语言功能:迭代器与闭包
  • 【Linux操作系统】详解Linux系统编程中的管道进程通信
  • 【Redis从头学-4】Redis中的String数据类型实战应用场景之验证码、浏览量、点赞量、Json格式存储
  • linux 统计命令
  • docker部署springboot应用
  • YOLO v5、v7、v8 模型优化
  • 回归预测 | MATLAB实现SSA-BP麻雀搜索算法优化BP神经网络多输入单输出回归预测(多指标,多图)
  • QT的mysql(数据库)最佳实践和常见问题解答
  • 使用PyMuPDF库的PDF合并和分拆程序
  • 2023/8/18 - You need to rely on yourself to achieve the life you want
  • Data Abstract for .NET and Delphi Crack
  • Eclipse集成MapStruct