箭头函数与普通函数区别

本文深入探讨了ES6中的箭头函数与普通函数的区别,通过实例展示了它们在`this`指向、函数体及作用域等方面的不同。在箭头函数中,`this`总是继承自外层作用域,而普通函数的`this`取决于函数调用方式。此外,还分析了箭头函数在闭包和构造函数中的行为,帮助开发者更好地理解和运用这两种函数类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ES6中允许使用“箭头”(=>) 来定义函数。箭头函数相当于匿名函数,并且简化了函数定义。

// 箭头函数
let foo = (name) => `我是${name}`
foo('nk') // 我是nk

// 等同于下面这个普通函数
let foo2 = function(name) {
    return `我是${name}`
}

箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }return

let foo = (name) => {
    if(name){
        return `我是${name}`
    }
    return 'nk'
}
foo('nk') // 我是nk
var name = '南玖'
function Person (name) {
  this.name = name
  this.foo1 = function () {
    console.log(this.name)
  },
  this.foo2 = () => console.log(this.name),
  this.foo3 = function () {
    return function () {
      console.log(this.name)
    }
  },
  this.foo4 = function () {
    return () => {
      console.log(this.name)
    }
  }
}
var person1 = new Person('nan')
var person2 = new Person('jiu')

person1.foo1() // 'nan'
person1.foo1.call(person2) // 'jiu'

person1.foo2() // 'nan'
person1.foo2.call(person2) // 'nan'

person1.foo3()() // '南玖'
person1.foo3.call(person2)() // '南玖'
person1.foo3().call(person2) // 'jiu'

person1.foo4()() // 'nan'
person1.foo4.call(person2)() // 'jiu'
person1.foo4().call(person2) // 'nan'

解析:

全局代码执行,person1 = new Person('nan'),person2 = new Person('jiu')执行完,person1中的this.namenanperson2中的this.namejiu,OK这一点清楚后,继续往下看:

  • 执行person1.foo1()foo1为普通函数,所以this应该指向person1,打印出nan
  • 执行person1.foo1.call(person2)foo1为普通函数,并且用call改变了this指向,所以它里面的this应该指向person2,打印出jiu
  • 执行person1.foo2()foo2为箭头函数,它的this指向上层作用域,也就是person1,所以打印出nan
  • 执行person1.foo2.call(person2),箭头函数的this指向无法使用call改变,所以它的this还是指向person1,打印出nan
  • 执行person1.foo3()(),这里先执行person1.foo3(),它返回了一个普通函数,接着再执行这个函数,此时就相当于在全局作用域中执行了一个普通函数,所以它的this指向window,打印出南玖
  • 执行person1.foo3.call(person2)()这个与上面类似,也是返回了一个普通函数再执行,其实前面的执行都不用关心,它也是相当于在全局作用域中执行了一个普通函数,所以它的this指向window,打印出南玖
  • 执行person1.foo3().call(person2)这里就是把foo3返回的普通函数的this绑定到person2上,所以打印出jiu
  • 执行person1.foo4()(),先执行person1.foo4()返回了一个箭头函数,再执行这个箭头函数,由于箭头函数的this始终指向它的上层作用域,所以打印出nan
  • 执行person1.foo4.call(person2)(),与上面类似只不过使用call把上层作用域的this改成了person2,所以打印出jiu
  • 执行person1.foo4().call(person2),这里是先执行了person1.foo4(),返回了箭头函数,再试图通过call改变改变该箭头函数的this指向,上面我们说到箭头函数的this始终指向它的上层作用域,所以打印出nan

 

2022年了你还不了解箭头函数与普通函数的区别吗? - 掘金

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张三风啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值