JavaScript中的this是一個(gè)非常重要的概念,它經(jīng)常被用來引用當(dāng)前執(zhí)行上下文中的對(duì)象。但是,this的條件和作用有時(shí)候會(huì)比較難以理解,尤其是當(dāng)代碼變得越來越復(fù)雜的時(shí)候。在這篇文章中,我們將探討JavaScript中this的四大原則。
## 第一大原則:默認(rèn)綁定
當(dāng)在全局作用域中使用一個(gè)函數(shù)時(shí),this通常指的是全局對(duì)象(window)。例如,考慮以下代碼:
當(dāng)我們執(zhí)行這段代碼時(shí),this會(huì)輸出window對(duì)象,因?yàn)樗悄J(rèn)的綁定目標(biāo)。
## 第二大原則:隱式綁定
當(dāng)在對(duì)象內(nèi)部調(diào)用一個(gè)函數(shù)時(shí),this通常指的是調(diào)用該函數(shù)的對(duì)象。例如,下面的代碼:
在這里,當(dāng)我們執(zhí)行person.sayHi()時(shí),this指的就是person對(duì)象本身。因此該函數(shù)會(huì)輸出“Hi, my name is Tom”。
然而,隱式綁定也有一些限制。如果函數(shù)是作為對(duì)象的一個(gè)屬性傳遞給某個(gè)調(diào)用函數(shù),那么this將會(huì)被綁定到全局對(duì)象而不是對(duì)象本身。例如:
在這段代碼中,我們將person.sayHi函數(shù)賦給了greet變量,然后再調(diào)用greet函數(shù)。但由于在這里的調(diào)用發(fā)生在全局作用域內(nèi),this將被綁定至window對(duì)象。
## 第三大原則:顯式綁定
當(dāng)使用call()或apply()方法調(diào)用函數(shù)時(shí),this將會(huì)被顯式地綁定到傳入的對(duì)象上。例如,考慮下面的代碼:
在這里,我們調(diào)用了test函數(shù)并使用call()方法將person對(duì)象傳入。這就將this綁定到了person對(duì)象本身。
## 第四大原則:new綁定
當(dāng)使用new關(guān)鍵字創(chuàng)建一個(gè)對(duì)象時(shí),this會(huì)被自動(dòng)綁定到該對(duì)象上。例如:
在這里我們創(chuàng)建了一個(gè)Person構(gòu)造函數(shù),并且使用new關(guān)鍵字創(chuàng)建了一個(gè)新的Person對(duì)象。在這個(gè)過程中,this被綁定到新創(chuàng)建的對(duì)象上。
以上就是JavaScript中this的四大原則:默認(rèn)綁定、隱式綁定、顯式綁定和new綁定。這些原則將幫助我們更好地理解什么時(shí)候this會(huì)被綁定到哪個(gè)對(duì)象上,從而更好地編寫JavaScript代碼。
## 第一大原則:默認(rèn)綁定
當(dāng)在全局作用域中使用一個(gè)函數(shù)時(shí),this通常指的是全局對(duì)象(window)。例如,考慮以下代碼:
function test() { console.log(this); } test();
當(dāng)我們執(zhí)行這段代碼時(shí),this會(huì)輸出window對(duì)象,因?yàn)樗悄J(rèn)的綁定目標(biāo)。
## 第二大原則:隱式綁定
當(dāng)在對(duì)象內(nèi)部調(diào)用一個(gè)函數(shù)時(shí),this通常指的是調(diào)用該函數(shù)的對(duì)象。例如,下面的代碼:
const person = {
name: 'Tom',
sayHi: function () {
console.log(Hi, my name is ${this.name}
); } }; person.sayHi();
在這里,當(dāng)我們執(zhí)行person.sayHi()時(shí),this指的就是person對(duì)象本身。因此該函數(shù)會(huì)輸出“Hi, my name is Tom”。
然而,隱式綁定也有一些限制。如果函數(shù)是作為對(duì)象的一個(gè)屬性傳遞給某個(gè)調(diào)用函數(shù),那么this將會(huì)被綁定到全局對(duì)象而不是對(duì)象本身。例如:
const person = {
name: 'Tom',
sayHi: function () {
console.log(Hi, my name is ${this.name}
); } }; const greet = person.sayHi; greet();
在這段代碼中,我們將person.sayHi函數(shù)賦給了greet變量,然后再調(diào)用greet函數(shù)。但由于在這里的調(diào)用發(fā)生在全局作用域內(nèi),this將被綁定至window對(duì)象。
## 第三大原則:顯式綁定
當(dāng)使用call()或apply()方法調(diào)用函數(shù)時(shí),this將會(huì)被顯式地綁定到傳入的對(duì)象上。例如,考慮下面的代碼:
function test() {
console.log(My name is ${this.name}
); } const person = {name: 'Tom'}; test.call(person);
在這里,我們調(diào)用了test函數(shù)并使用call()方法將person對(duì)象傳入。這就將this綁定到了person對(duì)象本身。
## 第四大原則:new綁定
當(dāng)使用new關(guān)鍵字創(chuàng)建一個(gè)對(duì)象時(shí),this會(huì)被自動(dòng)綁定到該對(duì)象上。例如:
function Person(name) {
this.name = name;
this.sayHi = function () {
console.log(Hi, my name is ${this.name}
); }; } const person = new Person('Tom'); person.sayHi();
在這里我們創(chuàng)建了一個(gè)Person構(gòu)造函數(shù),并且使用new關(guān)鍵字創(chuàng)建了一個(gè)新的Person對(duì)象。在這個(gè)過程中,this被綁定到新創(chuàng)建的對(duì)象上。
以上就是JavaScript中this的四大原則:默認(rèn)綁定、隱式綁定、顯式綁定和new綁定。這些原則將幫助我們更好地理解什么時(shí)候this會(huì)被綁定到哪個(gè)對(duì)象上,從而更好地編寫JavaScript代碼。