JavaScript 中的 this 關鍵字可能會令人困惑,因為它在常規函數和箭頭函數中的行為不同。在這篇文章中,我們將解釋這在兩種類型的函數中是如何運作的,探討為什麼存在這些差異,並提供在 JavaScript 中理解這一點所需的基本知識。
JavaScript 中的常規函數是使用 function 關鍵字定義的。這些函數中 this 的值取決於函數的呼叫方式。以下是幾個例子:
function regularFunction() { console.log(this); } regularFunction(); // Logs the global object (window in browsers)
說明: 在非嚴格模式下,當在全域上下文中呼叫函數時(不是作為物件的方法),this 指的是全域物件(瀏覽器中的window 或Node 中的global ) .js).
'use strict'; function regularFunction() { console.log(this); } regularFunction(); // Logs undefined
當函數作為物件的方法被呼叫時,this 引用該物件。
const obj = { method: function() { console.log(this); } }; obj.method(); // Logs obj
解釋: 在本例中,this 指向 obj,因為函數被呼叫為 obj 的方法。
當函數用作建構函式(使用 new 關鍵字呼叫)時,this 指的是新建立的實例。
function Person(name) { this.name = name; this.sayHello = function() { console.log(`Hello, my name is ${this.name}`); }; } const person1 = new Person('Alice'); person1.sayHello(); // Logs "Hello, my name is Alice" const person2 = new Person('Bob'); person2.sayHello(); // Logs "Hello, my name is Bob"
說明: 當使用 new 呼叫時,Person 建構函式中的 this 指的是正在建立的新實例。每個新實例(person1 和 person2)都有自己的 name 屬性和 sayHello 方法。
您可以使用call、apply 或bind 明確綁定它。
function regularFunction() { console.log(this); } const obj = { value: 42 }; regularFunction.call(obj); // Logs obj regularFunction.apply(obj); // Logs obj const boundFunction = regularFunction.bind(obj); boundFunction(); // Logs obj
說明: call 和 apply 立即呼叫將 this 設為 obj 的函數,而 bind 會建立一個新函數,並將 this 永久綁定到 obj。
ES6 中引入的箭頭函數沒有自己的 this 上下文。相反,它們從周圍的(詞彙)範圍繼承這一點。這使得箭頭函數在某些情況下很有用。
箭頭函數從定義它們的作用域繼承它。
const arrowFunction = () => { console.log(this); }; arrowFunction(); // Logs the global object (window in browsers)
說明:箭頭函數沒有自己的this;他們從周圍的範圍內使用這個。這裡,它指的是全域對象,因為函數是在全域範圍內定義的。
'use strict'; const arrowFunction = () => { console.log(this); }; arrowFunction(); // Logs undefined
與常規函數不同,箭頭函數在作為方法呼叫時不會獲得自己的 this。他們從封閉範圍繼承了這一點。
const obj = { method: () => { console.log(this); } }; obj.method(); // Logs the global object (window in browsers) or undefined in strict mode
說明:箭頭函數不綁定自己的 this 而是從詞法作用域繼承它。在這個例子中,this指的是全域物件或嚴格模式下的undefined,而不是obj。
當箭頭函數在另一個函數內部定義時,它會從外部函數繼承 this 。
function outerFunction() { const arrowFunction = () => { console.log(this); }; arrowFunction(); } const obj = { value: 42, outerFunction: outerFunction }; obj.outerFunction(); // Logs obj, because `this` in arrowFunction is inherited from outerFunction
說明:在這種情況下,箭頭函數內部的this指的是與outerFunction中相同的this,即obj。
事件處理程序中的箭頭函數從周圍的詞法範圍繼承此屬性,而不是從觸發事件的元素繼承。
const button = document.querySelector('button'); button.addEventListener('click', () => { console.log(this); }); // Logs the global object (window in browsers) or undefined in strict mode
Explanation: The arrow function does not bind this to the button element; it inherits it from the surrounding scope, which is the global scope or undefined in strict mode.
The difference between regular functions and arrow functions lies in how they handle this:
To understand the behavior of this in JavaScript, you need to know the following concepts:
Understanding these distinctions will help you write more predictable and maintainable JavaScript code. Whether you're using regular functions or arrow functions, knowing how this works is crucial for effective JavaScript development.
以上是為什麼「this」關鍵字在常規函數和箭頭函數中的行為不同的詳細內容。更多資訊請關注PHP中文網其他相關文章!