|
|
|
|
|
this
是JavaScript中常常用到關鍵字,但它在箭頭函數(shù)和常規(guī)函數(shù)中是不同的,因此我們在使用時要知道this
在箭頭函數(shù)和常規(guī)函數(shù)中的區(qū)別,知道不同后,才能正確使用它。
箭頭函數(shù)沒有自己的this
與常規(guī)函數(shù)不同,箭頭函數(shù)沒有自己的this
和參數(shù)綁定。相反,這些標識符像任何其他變量一樣在詞法范圍內解析。讓我們看一個簡單的例子:
name ="Arrow function"
let me = {
name: "Regular function",
thisInArrow:() => {
console.log("Example of " + this.name); //無 'this' 綁定
},
thisInRegular(){
console.log("Example of " + this.name); //'this' 綁定
}
};
me.thisInArrow();
me.thisInRegular();
輸出
Example of Arrow function
Example of Regular function
與常規(guī)函數(shù)不同,箭頭函數(shù)沒有自己的this
。在箭頭函數(shù)的情況下,this
指的是在定義this
箭頭函數(shù)的環(huán)境中的this
值(即“外部”箭頭函數(shù)),并且在函數(shù)的整個生命周期中保持不變,并且始終綁定到在最近的非箭頭父函數(shù)中。
讓我們再看一個簡單的例子:
在函數(shù)表達式的情況下,this
指的是在createObject
內部創(chuàng)建的對象,在箭頭函數(shù)的情況下,this
指的是createObject
自身的this
。
無論如何執(zhí)行或在何處執(zhí)行,箭頭函數(shù)內部的 this
值始終等于外部函數(shù)的 this
值。換句話說,箭頭函數(shù)可按詞法解析 this
,箭頭函數(shù)沒有定義自己的執(zhí)行上下文。
在以下示例中,myMethod()
是箭頭函數(shù) callback()
的外部函數(shù):
const myObject = {
myMethod(items) {
console.log(this); // logs "myObject"
const callback = () => {
console.log(this); // logs "myObject"
};
items.forEach(callback);
}
};
myObject.myMethod([1, 2, 3]);
輸出
箭頭函數(shù) callback()
中的 this
值等于外部函數(shù) myMethod()
的 this
。
this
詞法解析是箭頭函數(shù)的重要功能之一。在方法內部使用回調時,要確保箭頭函數(shù)沒有定義自己的 this
:不再有 const self = this
或者 callback.bind(this)
這種解決方法。
箭頭函數(shù)沒有自己的參數(shù)綁定
參數(shù)對象在箭頭函數(shù)中不可用,但在常規(guī)函數(shù)中可用。
常規(guī)函數(shù):
let myFunc = {
showArgs(){
console.log(arguments);
}
};
myFunc.showArgs(1, 2, 3, 4);
輸出
箭頭函數(shù)
let myFunc = {
showArgs : ()=> {
console.log(arguments);
}
};
myFunc.showArgs(1, 2, 3, 4);
輸出
總結
本文通過實例介紹了箭頭函數(shù)和常規(guī)函數(shù)的this
值的區(qū)別,通過本文的學習,我們應該了解到箭頭函數(shù)和常規(guī)函數(shù)的this
值的不同之處,在使用中要正確處理。