箭頭函數和普通函數的主要區別:數組
(1)箭頭函數是不存在this的,它的this是繼承自父執行的上下文中,並且不能使用call、apply、bind來改變this的指向,箭頭函數中的this是永遠不會改變的。markdown
好比這裏的箭頭函數的this.x,箭頭函數和say平級以key:value的形式,也就是箭頭函數自己所在的對象爲obj,而obj的父執行上下文就是window,因此這裏的this.x實際上表示的是window.x,所以輸出11.app
var x = 11;
var obj = {
x:22,
say:()=>{
console.log(this.x);
}
}
obj.say();//11
複製代碼
(2) 普通函數this指向的是它的直接調用者。函數
// 普通函數
var name = "ice";
var obj = {
name: "leaf",
getName: function() {
console.log(this.name);//this指的是它的直角調用者,就是obj,因此返回leaf
}
};
obj.getName(); // 此時指向調用者obj,輸出leaf
//箭頭函數
var name = "ice";
var obj = {
name: "leaf",
getName: () => {
console.log(this.name);
// 指向定義時所在的對象,name是在全局的環境下建立的,全部this指向的是全局對象
}
};
obj.getName();//ice
var obj1 = { name: "haha" };
obj.getName.call(obj1); // 沒法改變this指向 輸出仍是ice
複製代碼
//普通函數
function Person() {
console.log("person");
}//定義一個構造函數
const myFather = new Person();//構造函數的實例化對象
//箭頭函數
let Person2 = () => {
console.log("person2");
}
console.log(Person2.prototype);//undefined
const myFather2 = new Person2();////Person2 is not a constructor
複製代碼
let Person2 = () => {
console.log(person2.argements);
}
Person2(10,20,30)// Person3 is not defined
//只能使用...arg來獲取參數集合(數組)
let Person2 = (...arg) => {
console.log(arg);
}
Person2(10, 20, 30)// [10, 20, 30]
複製代碼
持續補充更新,記錄很差的地方望指出修改,共同進步~ui