1. 程式人生 > >箭頭性函式的一些特徵和注意事項

箭頭性函式的一些特徵和注意事項

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的值為"{}"或windowthis.name的值為undefined或""(空字串)。將上面的這段程式碼寫在檔案中,在node環境中執行,this的值輸出為"{}",這個空物件就是exports

,因為沒有寫exportsexports就預設指向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

箭頭函式的優點

  • 使用箭頭函式比普通函式少些動詞,如:functionreturn
  • this提前定義,從上下文可以捕獲this

注意:箭頭函式內容實體中不能使用statement作為表示式expression。