箭頭性函式的一些特徵和注意事項
1、typeof運算子和普通的函式一樣
let commFunc = () => {};
console.log(typeof commFunc);
輸出為function
。
let arrowFunc = () => {};
console.log(typeof arrowFunc);
輸出也為function
。
從此可以看出箭頭函式的型別和普通的函式一樣都為function
。
2、instanceof
也返回true
,表明是Function的例項
let func = () => {}; console.log(func instanceof Function);
輸出為true
,由此可以看出箭頭函式也是Function的例項
3、箭頭函式中的this
繼承外圍作用域
let person = {
name: "galler",
say: () => {
console.log(this);
console.log(this.name);
}
};
person.say();
this
的值為"{}"或window
,this.name
的值為undefined
或""(空字串)。將上面的這段程式碼寫在檔案中,在node環境中執行,this
的值輸出為"{}",這個空物件就是exports
exports
,exports
就預設指向module.exports
,而module.exports
就是個空物件。但是在命令列中執行上面程式碼(依然是node環境中),則this
指向global
物件(這些有可能偏離中心,但是大家可以試試,在這段程式碼前加上exports.name = "susan"
,此時的this
指向{"name","susan"}
物件,this.name
的值就是susan
)
let person = { name: "galler", speak: function() { console.log(this); console.log(this.name); } }; person.speak();
this
的值為person物件,this.name
的值為galler。
小結:箭頭函式本身沒有this
。在上面的demo中根據詞法作用域,於是向上查詢this
,則發現this
指向window
物件(瀏覽器環境)或者{}(Node環境中),由於window
和{}物件沒有name
屬性,則this.name
為""(瀏覽器環境)或者undefined
(Node環境)
4、返回物件用小括號括起來
let person = () => {
name:"galler"
}
console.log(person());
輸出為undefined
。此時的"{}"表明函式的起始位置和結束位置,由於該函式沒有返回值,所以被呼叫時值為undefined
let person = () => ({
name:"galler"
});
console.log(person());
輸出為{name:"galler"}
。 此時"{}"表示定義一個物件。用"()"括起來表示是一個表示式,預設返回該物件。
5、箭頭函式中不能使用new
let Person = (name) => {
this.name = name;
};
let one = new Person("galler");
執行該程式,則出現TypeError: Person is not a constructor
6、arguments
function person() {
console.log(arguments);
}
person(1);
一般的函式使用arguments
,在瀏覽器中輸出為一個數組:[1]
,在Node環境中輸出為一個物件:{'0':1}
let person = () => {
console.log(arguments);
};
person("galler");
箭頭函式使用arguments
,在瀏覽器環境中,則出現ReferenceError
,在Node環境中輸出{"0":{},……}
。
由此可以得出,箭頭函式與普通函式的再一個區別:不能使用arguments
物件。
7、沒有原型
let person = () => {}
console.log(person.prototype);
輸出為undefined
。由此可以看出箭頭函式沒有原型。
箭頭函式產生的目的
- 簡潔語法
- 與父作用域共享關鍵字
this
箭頭函式的優點
- 使用箭頭函式比普通函式少些動詞,如:
function
或return
this
提前定義,從上下文可以捕獲this
。
注意:箭頭函式內容實體中不能使用statement作為表示式expression。