箭頭函數(shù)是什么箕母?(What)
箭頭函數(shù) (Arrow Functions)也稱“胖箭頭函數(shù)”储藐,是ES6全新的特性。是個簡寫的函數(shù)表達(dá)式嘶是,擁有詞法作用域的this
钙勃。此外,箭頭函數(shù)總是匿名的聂喇。(詞法作用域就是一個變量的作用在定義的時候就已經(jīng)被定義好辖源,當(dāng)在本作用域中找不到變量,就會一直向父作用域中查找希太,直到找到為止克饶。)
箭頭函數(shù)的語法(How)
- ()=>{return 1;}
函數(shù)無參數(shù),返回值為1
- (x)=>x*x;
返回值為參數(shù)的平方跛十,當(dāng)函數(shù)體只有一條語句時彤路,則可以省略大括號{},默認(rèn)返回該表達(dá)式的值芥映。
- x=>x*x;
只有一個參數(shù)時洲尊,則可以省略小括號()
- ()=>{……return 1;}
返回值為1。(使用塊語句的箭頭函數(shù)不會自動返回值奈偏,需要使用return語句將所需的值返回)
- ()=>({})
返回值為對象
箭頭函數(shù)的特性
1坞嘀、typeof運(yùn)算符和普通的函數(shù)一樣
let commFunc = () => {};
console.log(typeof commFunc);
輸出為function
。
let arrowFunc = () => {};
console.log(typeof arrowFunc);
輸出也為function
惊来。
從此可以看出箭頭函數(shù)的類型和普通的函數(shù)一樣都為function
丽涩。
2、instanceof
也返回true
裁蚁,表明是Function的實(shí)例
let func = () => {};
console.log(func instanceof Function);
輸出為true
矢渊,由此可以看出箭頭函數(shù)也是Function的實(shí)例
3、箭頭函數(shù)中的this
繼承外圍作用域
let person = {
name: "galler",
say: () => {
console.log(this);
console.log(this.name);
}
};
person.say();
this
的值為"{}"或window
枉证,this.name
的值為undefined
或""(空字符串)矮男。將上面的這段代碼寫在文件中,在node環(huán)境中運(yùn)行室谚,this
的值輸出為"{}"毡鉴,這個空對象就是exports
崔泵,因?yàn)闆]有寫exports
,exports
就默認(rèn)指向module.exports
,而module.exports
就是個空對象猪瞬。但是在命令行中運(yùn)行上面代碼(依然是node環(huán)境中)憎瘸,則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。
小結(jié):箭頭函數(shù)本身沒有this
甘晤。在上面的demo中根據(jù)詞法作用域含潘,于是向上查找this
,則發(fā)現(xiàn)this
指向window
對象(瀏覽器環(huán)境)或者{}(Node環(huán)境中)线婚,由于window
和{}對象沒有name
屬性遏弱,則this.name
為""(瀏覽器環(huán)境)或者undefined
(Node環(huán)境)
4、返回對象用小括號括起來
let person = () => {
name:"galler"
}
console.log(person());
輸出為undefined
塞弊。此時的"{}"表明函數(shù)的起始位置和結(jié)束位置漱逸,由于該函數(shù)沒有返回值,所以被調(diào)用時值為undefined
let person = () => ({
name:"galler"
});
console.log(person());
輸出為{name:"galler"}
游沿。 此時"{}"表示定義一個對象饰抒。用"()"括起來表示是一個表達(dá)式,默認(rèn)返回該對象诀黍。
5袋坑、箭頭函數(shù)中不能使用new
let Person = (name) => {
this.name = name;
};
let one = new Person("galler");
運(yùn)行該程序,則出現(xiàn)TypeError: Person is not a constructor
6眯勾、arguments
function person() {
console.log(arguments);
}
person(1);
一般的函數(shù)使用arguments
枣宫,在瀏覽器中輸出為一個數(shù)組:[1]
,在Node環(huán)境中輸出為一個對象:{'0':1}
let person = () => {
console.log(arguments);
};
person("galler");
箭頭函數(shù)使用arguments
吃环,在瀏覽器環(huán)境中也颤,則出現(xiàn)ReferenceError
,在Node環(huán)境中輸出{"0":{}郁轻,……}
翅娶。
由此可以得出,箭頭函數(shù)與普通函數(shù)的再一個區(qū)別:不能使用arguments
對象好唯。
7竭沫、沒有原型
let person = () => {}
console.log(person.prototype);
輸出為undefined
。由此可以看出箭頭函數(shù)沒有原型骑篙。
箭頭函數(shù)產(chǎn)生的目的
- 簡潔語法
- 與父作用域共享關(guān)鍵字
this
箭頭函數(shù)的優(yōu)點(diǎn)
- 使用箭頭函數(shù)比普通函數(shù)少些動詞输吏,如:
function
或return
this
提前定義,從上下文可以捕獲this
替蛉。
注意:箭頭函數(shù)內(nèi)容實(shí)體中不能使用statement作為表達(dá)式expression贯溅。
事物都是有兩面性的,所以箭頭函數(shù)的優(yōu)點(diǎn)即缺點(diǎn)躲查。代碼太過簡單它浅,導(dǎo)致不好閱讀,this
提前定義镣煮。