前言
在 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。