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

这篇具有很好参考价值的文章主要介绍了【ES6】箭头函数和普通函数的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

let demo01Fun =new demo01();


</script>

输出结果:
【ES6】箭头函数和普通函数的区别,前端,es6,前端,ecmascript

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

let demo02Fun =new demo02();


</script>

【ES6】箭头函数和普通函数的区别,前端,es6,前端,ecmascript

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

<script>

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

var id = 21;

demo01.call({ id: 42 });

</script>

输出结果:
【ES6】箭头函数和普通函数的区别,前端,es6,前端,ecmascript
但是同样是调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>

【ES6】箭头函数和普通函数的区别,前端,es6,前端,ecmascript
下面给代码加上断点调试一下看看:

<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
【ES6】箭头函数和普通函数的区别,前端,es6,前端,ecmascript
代码运行到第二断点处,此时出现方法demo02的局部变量Local,this指向的是{id:42}
【ES6】箭头函数和普通函数的区别,前端,es6,前端,ecmascript
代码运行到定时器时,this指向的windows,id=21。
【ES6】箭头函数和普通函数的区别,前端,es6,前端,ecmascript
而定时器中是箭头函数的,这时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分别输出什么?文章来源地址https://www.toymoban.com/news/detail-658890.html

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}); 

到了这里,关于【ES6】箭头函数和普通函数的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES6系列之let、const、箭头函数使用的坑

    变量提升 块级作用域的重要性 箭头函数this的指向 rest参数和arguments Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在老版本的浏览器执行。这意味着,你可以用ES6的方式编写程序,又不用担心现有环境是否支持。  上面的原始代码用了箭头函数,Babel将其转

    2024年02月14日
    浏览(42)
  • 【ECMAScript】ES6-ES11学习笔记

    注意事项 代码中的注释有笔记如 有一些错误示范代码,为了代码整体可运行,将其注释如 当代码有输出是,通常将输出放在对应代码下一行,并注释如下 1.声明变量 2.定义常量 3.解构赋值 4.模板字符串 5.简化对象写法 6.箭头函数 箭头函数适合与this无关的回调,定时器,数

    2024年02月13日
    浏览(43)
  • ES5 构造函数与ES6 Class的区别

    Class 类中不存在变量提升 class内部会启用严格模式 class的所有方法都是不可枚举的 class 必须使用new调用 class 内部无法重写类名 class 的继承有两条继承链 一条是: 子类的__proto__ 指向父类 另一条: 子类prototype属性的__proto__属性指向父类的prototype属性. es6的子类可以通过__pro

    2024年02月06日
    浏览(106)
  • ES5 的构造函数和 ES6 的类有什么区别

    在JavaScript中,类和构造函数都被用来创建对象,接下来会从以下几点说说两者的区别: 构造函数使用函数来定义 类使用class来定义 ES6 的 class 可以看作是一个语法糖,这种写法只是让对象原型的写法更加清晰、更像面向对象编程的语法。 比如这是一个构造函数生成实

    2024年02月11日
    浏览(42)
  • ES6 全详解 let 、 const 、解构赋值、剩余运算符、函数默认参数、扩展运算符、箭头函数、新增方法,promise、Set、class等等

    ​ ECMAScript 6.0,简称 ES6,是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言 要讲清楚这个问题,需要回顾历史。1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaSc

    2024年04月15日
    浏览(46)
  • ES6(ECMAScript 2015)有哪些新属性,如何判断当前浏览器是否支持?

    ES6(ECMAScript 2015)引入了许多新的语法和特性,以增强 JavaScript 编程语言的功能。以下是一些常见的 ES6 语法和特性以及它们的解释: let 和 const 声明 : let 和 const 用于声明变量,代替了旧的 var 。 let 声明的变量具有块级作用域,而 const 声明的变量是不可变的(常量

    2024年02月07日
    浏览(60)
  • 【React系列】ES6学习笔记(一)let与const、解构赋值、函数参数默认值\rest参数\箭头函数、数组和对象的扩展、Set和Map等

    本文参考自电子书《ECMAScript 6 入门》:https://es6.ruanyifeng.com/ 尽量使用 let 声明变量,而不是 var 。 let 声明的变量是 块级作用域 , var 声明的变量是 全局作用域 。 使用 let 变量 必须先声明再使用,否则报错,不存在变量提升 。相对的 var 声明的变量如果提前使用,不会报错

    2024年02月03日
    浏览(55)
  • es5和es6区别

    ES5和ES6都是JavaScript语言的版本,ES5在2009年发布,ES6在2015年发布,两者之间有以下的区别: 1、变量声明方式不同:ES5使用var进行变量声明,而ES6则引入了let和const来声明变量。 2、块级作用域:在ES5中,只存在全局作用域和函数作用域,而ES6中增加了块级作用域

    2024年02月10日
    浏览(42)
  • es5和es6的区别

    ES5 和 ES6 的区别 ECMAScript5,即 ES5,是 ECMAScript 的第五次修订,于 2009 年完成标准化 ECMAScript6,即 ES6,是 ECMAScript 的第六次修订,于 2015 年完成,也称 ES2015 ES6 是继 ES5 之后的一次改进,相对于 ES5 更加简洁,提高了开发效率. ES6 的新增方法 1、新增声明命令 let 和 const 在 ES6

    2024年01月16日
    浏览(40)
  • 谈谈ES5和ES6的区别

    我们都知道JavaScript是由三部分组成: 1. ECMAScript(核心):规定了语言的组成部分=语法、类型、语句、、保留字、操作符、对象 2. BOM(浏览器对象模型): 支持访问和操作浏览器窗口,可以控制浏览器显示页面以外的部分。 3. DOM(文档对象模型): 把整个页面映射为一个多层节

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包