箭头函数与普通函数的区别详解[通俗易懂]

箭头函数与普通函数的区别详解[通俗易懂]箭头函数和普通函数的区别一.外形不同:箭头函数使用箭头定义,普通函数中没有代码实例如下://普通函数functionfunc(){//code}//箭头函数letfunc=()=>{//code}二.箭头函数都是匿名函数普通函数可以有匿名函数,也可以有具体名函数,但是箭头函数都是匿名函数。代码实例如下://具名函数functionfunc(){//code}//匿名函数letfunc=function(){//cod

大家好,又见面了,我是你们的朋友全栈君。

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

一.外形不同:箭头函数使用箭头定义,普通函数中没有
代码实例如下:

// 普通函数
function func(){
  // code
}
// 箭头函数
let func=()=>{
  // code
}

二.箭头函数都是匿名函数
普通函数可以有匿名函数,也可以有具体名函数,但是箭头函数都是匿名函数。
代码实例如下:

// 具名函数
function func(){
  // code
}
 
// 匿名函数
let func=function(){
  // code
}

// 箭头函数全都是匿名函数
let func=()=>{
  // code
}

三.箭头函数不能用于构造函数,不能使用new
普通函数可以用于构造函数,以此创建对象实例。
代码实例如下:

function Person(name,age){
   this.name=name;
   this.age=age;
}
let admin=new Person("恩诺小弦",18);
console.log(admin.name);
console.log(admin.age);

代码运行如下:

恩诺小弦
18

Person用作构造函数,通过它可以创建实例化对象。
但是构造函数不能用作构造函数。

四.箭头函数中this的指向不同
在普通函数中,this总是指向调用它的对象,如果用作构造函数,this指向创建的对象实例。
1.箭头函数本身不创建this
也可以说箭头函数本身没有this,但是它在声明时可以捕获其所在上下文的this供自己使用。
注意:this一旦被捕获,就不再发生变化

var webName="捕获成功";
let func=()=>{
  console.log(this.webName);
}
func();

运行结果如下:

捕获成功

代码分析:箭头函数在全局作用域声明,所以它捕获全局作用域中的this,this指向window对象。

例子:

var name = "恩诺1";
function wrap(){
  this.name="恩诺2";
  let func=() => {
    console.log(this.name);
  }
  func();
}
let en=new wrap();

运行结果如下:

恩诺2

代码分析:
(1)wrap()用作构造函数。
(2)使用new调用wrap()函数之后,此函数作用域中的this指向创建的实例化对象。
(3)箭头函数此时被声明,捕获这个this。
(4)所以打印的是恩诺2,而不是恩诺1。
2.结合call(),apply()方法使用
箭头函数结合call(),apply()方法调用一个函数时,只传入一个参数对this没有影响。

let obj2 = {
    a: 10,
    b: function(n) {
        let f = (n) => n + this.a;
        return f(n);
    },
    c: function(n) {
        let f = (n) => n + this.a;
        let m = {
            a: 20
        };
        return f.call(m,n);
    }
};
console.log(obj2.b(1));  // 结果:11
console.log(obj2.c(1)); // 结果:11

3.箭头函数不绑定arguments,取而代之用rest参数…解决
每一个普通函数调用后都具有一个arguments对象,用来存储实际传递的参数。但是箭头函数并没有此对象。

function A(a){
  console.log(arguments);
}
A(1,2,3,4,5,8);  //  [1, 2, 3, 4, 5, 8, callee: ƒ, Symbol(Symbol.iterator): ƒ]


let B = (b)=>{
  console.log(arguments);
}
B(2,92,32,32);   // Uncaught ReferenceError: arguments is not defined


let C = (...c) => {
  console.log(c);
}
C(3,82,32,11323);  // [3, 82, 32, 11323]

4.其他区别
(1).箭头函数不能Generator函数,不能使用yeild关键字。
(2).箭头函数不具有prototype原型对象。
(3).箭头函数不具有super。
(4).箭头函数不具有new.target。

总结
(1).箭头函数的 this 永远指向其上下文的 this ,任何方法都改变不了其指向,如 call() , bind() , apply()
(2).普通函数的this指向调用它的那个对象

参考
https://www.cnblogs.com/biubiuxixiya/p/8610594.html
https://www.softwhy.com/article-9330-1.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148732.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 秒懂百科视频下载(秒懂百科全集)

    秒懂百科视频下载相信很多小伙伴都有想要下载秒懂百科的视频,可是bd就是不让下载,怎么办呢,这里有一个小方法提供给大家。。。。1.首先,要下载M3U8_Downloader下载器,地址:https://pan.baidu.com/s/1kVK8FQ32.在百度百科里输入你要下载视频的词条,如图所示:请点击输入图片描述3.按键盘上的f12,打开网页的源码界面,选择network选项后,点击f5刷新后再点击你需要播放的视频,在源码界面找到.m3u8为后缀的文件,如图所示:请点击输入图片描述4.

    2022年4月17日
    198
  • 最大公约数(Greatest Common Divisor)

    最大公约数(Greatest Common Divisor)

    2022年1月12日
    40
  • php 判断是否对象_php怎么判断对象是否为空

    php 判断是否对象_php怎么判断对象是否为空PHP中判断一个变量是否为空,有多种办法,下面分别来看一下1.isset功能:判断变量是否被初始化说明:它并不会判断变量是否为空,并且可以用来判断数组中元素是否被定义过注意:当使用isset来判断数组元素是否被初始化过时,它的效率比array_key_exists高4倍左右。2.empty功能:检测变量是否为”空”说明:任何一个未初始化的变量、值为0或false或空字符串””或nu…

    2022年6月4日
    178
  • dubbo如何实现rpc调用_dubbo支持grpc

    dubbo如何实现rpc调用_dubbo支持grpc使用telnet测试dubborpc接口

    2022年10月7日
    4
  • rpc协议详解

    rpc协议详解RPC是一种远程过程调用的协议,使用这种协议向另一台计算机上的程序请求服务,不需要了解底层网络技术的协议。HTTP是一种超文本传输协议。是WWW浏览器和WWW服务器之间的应用层通讯协议。TCP协议:传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。https://mp.weixin.qq.com/s?src=11&timestamp=1611734678&ver=2853&signature=igsdPz20ZUht*1IskaU0LxnFKvD6tD.

    2022年5月19日
    93
  • 效率极低人群的七大习惯你占了几项?

    效率极低人群的七大习惯你占了几项?

    2021年8月6日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号