一、语法简洁,更加清晰
// 普通函数
const fn = function test(a,b) {
}
// 箭头函数
const fn = (a,b)=>{
}
// 若只有一个参数,小括号可省略
const fn = a =>{
return a + 1
}
// 若执行语句只有一句return,中括号也可省略
const fn = a => return a + 1
二、不绑定this
箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值;
this代表函数调用相关联的对象,通常也称之为执行上下文。
let obj1 = {
test: function() {
console.log(this)
}
}
obj1.test() //{ test: func }
let obj2 = {
test: () => {
console.log(this)
}
}
obj2.test() //{}
提问:this的指向有哪几种情况?
1.作为函数直接调用,非严格模式下,this指向window,严格模式下,this指向undefined;
2.作为某对象的方法调用,this通常指向调用的对象。
3.普通函数使用apply、call、bind 可以绑定this的指向。
4.在构造函数中,this指向新创建的对象
5.箭头函数没有单独的this值,this在箭头函数创建时确定,它与声明所在的上下文相同。
三、this指向不变
箭头函数继承而来的this指向永远不变,call()、apply()、bind() 方法无法改变箭头函数中this的指向
const fn = (a, b) => {
console.log(this)
}
fn() // window
fn.call({ name: "lfy" }, 1, 2) // 还是window
四、没有原型prototype
没有原型prototype, 指向 undefined
// 普通函数
const fn1 = function () {}
console.log(fn1.prototype) // constructor
// 箭头函数
const fn2 = a => {}
console.log(fn2.prototype) // undefined
五、不能作为构造函数使用
new关键词会进行如下的操作:
1.创建一个空对象;
2.链接该对象(设置该对象的__proto__)到构造器函数的原型 ,将新创建的对象作为this的上下文 ;
3.执行构造函数种的代码为新对象增加属性和方法;
4.返回新对象。若没有返回对象则返回this。
具体执行流程可以用代码体现出来:
function newFunc(father, ...rest) {
// 首先创建一个空对象
var result = {};
// 将空对象的原型赋值为构造器函数的原型
result.__proto__ = father.prototype;
// 更改构造器函数内部this,将其指向新创建的空对象
var result2 = father.apply(result, rest);
if ((typeof result2 === 'object' || typeof result2 === 'function') && result2 !== null) {
return result2;
}
return result;
}
箭头函数不能作为构造函数使用, 因为没有自己的 this,无法调用 call,apply, 也没有 prototype 属性 ,而 new 命令在执行时需要将构造函数的 prototype 赋值给新的对象的__prpto__
六、没有自己的arguments
const fn = () => {
console.log(arguments) //arguments is not defined
}
fn(1, 2, 3, 4)
箭头函数没有自己的arguments,在箭头函数中访问arguments实际上获得的是外层局部(函数)执行环境中的值。如果要用,可以用 rest 参数代替。
const fn1 = (...rest) => {
console.log(rest) //[1,2,3,4]
}
fn1(1, 2, 3, 4)
七、不能使用yield关键字
箭头函数不能作为生成器函数,也就是其内部不能使用yeild
总结
箭头函数和普通函数的区别基本就是这些了,希望可以帮助到你,关于yield关键字的用法以及生成器函数的概念的介绍,等我这两天整理一下再写一篇文章,感兴趣的朋友可以关注一下,我们共同学习,共同进步!