前言
在 JavaScript 中,箭頭函式(arrow function)與傳統函式在 this
的行為上有一些不同。箭頭函式不會創建自己的 this
,而是繼承外部作用域的 this
,這就是為什麼你會遇到 this
的問題。
傳統函式中的 this
在傳統的函式中,this
會指向該函式被調用時的上下文。例如,當函式作為事件處理器時,this
會指向觸發事件的元素。
function regularFunction() { |
箭頭函式中的 this
在箭頭函式中,this
並不會綁定到函式的上下文,而是繼承自外部作用域。這通常會讓箭頭函式的 this
變得不同於你預期的結果。
例子:this
的問題
假設有這樣的情境,當你在一個物件的方法中使用箭頭函式作為事件處理器,this
會指向外部作用域,而不是該物件本身。
const obj = { |
- 在傳統函式中,
this
會指向觸發事件的 DOM 元素(這裡是btn
按鈕)。 - 在箭頭函式中,
this
會指向外部作用域(這裡是obj
物件),因為箭頭函式不會創建自己的this
。
解決方案:確保 this
正確指向
如果你希望 this
指向物件本身,可以使用傳統函式或手動綁定 this
。
使用傳統函式
如果你希望在事件處理器中讓 this
指向物件本身,可以使用傳統函式,或者使用 bind
顯式綁定 this
。
const obj = { |
另一個選項:箭頭函式和外部 this
如果你希望繼續使用箭頭函式,你可以將物件的 this
儲存到外部變數中,並在箭頭函式中引用它。
const obj = { |
總結
- 傳統函式 會根據調用上下文決定
this
的值。 - 箭頭函式 會繼承外部作用域的
this
,不會創建自己的this
,這樣在某些情況下會導致this
不如預期。 - 如果你需要在事件處理器中使用物件的
this
,可以選擇使用傳統函式或顯式綁定this
。