函数
带名,匿名,箭头函数重要区别
- 普通带名函数
js
function abs(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
- 匿名函数
js
let abs = function (x) {
if (x >= 0) {
return x;
} else {
return -x;
}
};
- 箭头函数
js
(x) => x * x;
相当于
js
function (x) {
return x * x;
}
当箭头函数不仅包含一个表达式时:
js
(x, y) => {
if (x > 0) {
return x + y;
} else {
return -x + y;
}
};
举例
js
var obj1 = {
birth: 1990,
getAge: function (year) {
let fn = function (y) {
return y - this.birth; // this指向window或undefined
};
return fn(year);
},
};
var obj2 = {
birth: 1990,
getAge: function (year) {
var fn = (y) => y - this.birth; // this.birth为1990
return fn(year);
},
};
调用函数 obj1.getAge(2017)和调用 obj2.getAge(2017)会得到相同的结果吗?
obj1 中 fn 函数,由于 JavaScript 中函数对 this 绑定的错误处理,得不到预期的结果,this.birth 指向 window 或 undefined。
但是 obj2,fn 函数是箭头函数,箭头函数完全修复了 this 的指向,this 总是指向词法作用域,也就是外层调用者 obj2。
区别:
- 箭头函数不能作为构造函数。
- 箭头函数没有 prototype(原型),所以箭头函数本身没有 this。
- 箭头函数内部的 this 是词法作用域,由上下文确定,this 指向在定义的时候继承自外层第一个普通函数的 this。函数体内的 this 对象,就是定义时所在的对象,与使用时所在的对象无关。