普通函数: function fn() { }
箭头函数: () => {}
如图:我们会使用new来创建构造函数的实例,但是箭头函数是不可以的,并且箭头函数是匿名的是函数表达式,因为不能用new关键字来调用箭头函数,那么不会自动生成prototype属性。
-
箭头函数简写规则如下
- 只有形参只有一个,可以
不要小括号 - 方法体内容,只有一行代码,可以不要大括号
- 方法体内容,只有一行代码,可以不要return,代码执行结果决定return内容
- 只有形参只有一个,可以
-
箭头函数不绑定this关键字,箭头函数中的this,指向箭头函数
定义位置的上下文this不会通过call apply bind来改变this的指向,但是箭头函数依旧可以调用call apply bind方法,指向外层作用域,而普通函数谁调用这个函数那么this就指向谁。
let obj = {
name:'光头强',
age:18,
sayFn(){
console.log(this);
let that = this
setTimeout(function() {
console.log(`${that.name}来了`);
},2000)
}
}
obj.sayFn()
在普通函数中谁调用this就指向谁,如上代码setTimeout里的this指向window需要改变this指向,才能输出。
普通函数
<script>
function people () {
return arguments.length
}
console.log("我有" +people(1,2,3) +"辆劳斯莱斯" );
//我有3辆劳斯莱斯
</script>
箭头函数
<script>
let people = () => arguments.length
console.log("我有" +people(1,2,3) +"辆劳斯莱斯" );
//Uncaught ReferenceError: arguments is not defined at people
</script>
在函数内部有一个类似数组的对象arguments,普通函数需要复用因此有对象arguments可以实现更灵活的操作,但是箭头函数没有自己的对象arguments(匿名函数不用参数或者限定参数来执行),通过创建一个普通函数,普通函数返回一个箭头函数,箭头函数在返回arguments的长度,在通过变量接收来保存函数输入的参数,当执行
worker函数表达式的时候相当于实现了people(1,2,3)(),people(1,2,3)()相当于先执行普通函数返回箭头函数,在执行箭头函数,由于作用域链的关系箭头函数保存了arguments的长度,就返回了结果(闭包作用),也能实现arguments的效果。如图: