this關(guān)鍵字在javascript中經(jīng)常被使用,尤其是在面向?qū)ο蟮木幊讨?,但很多初學(xué)者對它的理解仍然不夠深刻。本文將通過舉例詳細解釋this在javascript中的作用和指向。
this指向函數(shù)的調(diào)用者,也就是說它的值取決于函數(shù)被誰調(diào)用。舉個例子,假設(shè)有如下代碼:
當(dāng)我們運行上面的代碼后,控制臺將會輸出全局對象(window)。這是因為foo函數(shù)是在全局作用域中被調(diào)用的,因此this指向全局對象。
但是,如果我們將代碼稍微改一下:
此時控制臺輸出的值將是obj對象。這是因為foo函數(shù)是在obj對象的上下文中被調(diào)用的,因此this指向obj對象。
同樣的道理,當(dāng)函數(shù)作為一個對象的方法被調(diào)用時,this將會指向該對象。舉個例子:
此時控制臺將會輸出John。因為this指向了obj對象,而name是obj對象的一個屬性。
但是,如果我們將函數(shù)作為一個普通函數(shù)調(diào)用,this將會指向全局對象。比如下面這個例子:
在上面的例子中,foo函數(shù)被call方法調(diào)用,并且傳入了一個參數(shù)。這里的參數(shù)是一個對象,當(dāng)call方法調(diào)用函數(shù)時,函數(shù)內(nèi)的this就會指向該對象。因此控制臺會輸出{name: "John"}。
除了call方法,javascript還提供了apply和bind方法來顯式地改變函數(shù)內(nèi)this的指向。比如下面這個例子:
在上面的例子中,我們使用了bind方法來將obj.foo函數(shù)中的this指向了bar對象。因此控制臺會輸出Mary。
總結(jié)一下,this指的是函數(shù)被調(diào)用時的執(zhí)行上下文。當(dāng)函數(shù)作為對象的方法被調(diào)用時,this指向該對象。當(dāng)函數(shù)被直接調(diào)用時,this指向全局對象。此外,我們還可以通過使用call、apply和bind方法來顯式地改變this的指向。
this指向函數(shù)的調(diào)用者,也就是說它的值取決于函數(shù)被誰調(diào)用。舉個例子,假設(shè)有如下代碼:
function foo() { console.log(this); } foo();
當(dāng)我們運行上面的代碼后,控制臺將會輸出全局對象(window)。這是因為foo函數(shù)是在全局作用域中被調(diào)用的,因此this指向全局對象。
但是,如果我們將代碼稍微改一下:
var obj = { name: "John", foo: function() { console.log(this); } }; obj.foo();
此時控制臺輸出的值將是obj對象。這是因為foo函數(shù)是在obj對象的上下文中被調(diào)用的,因此this指向obj對象。
同樣的道理,當(dāng)函數(shù)作為一個對象的方法被調(diào)用時,this將會指向該對象。舉個例子:
var obj = { name: "John", foo: function() { console.log(this.name); } }; obj.foo();
此時控制臺將會輸出John。因為this指向了obj對象,而name是obj對象的一個屬性。
但是,如果我們將函數(shù)作為一個普通函數(shù)調(diào)用,this將會指向全局對象。比如下面這個例子:
function foo() { console.log(this); } var bar = { name: "John" }; foo.call(bar);
在上面的例子中,foo函數(shù)被call方法調(diào)用,并且傳入了一個參數(shù)。這里的參數(shù)是一個對象,當(dāng)call方法調(diào)用函數(shù)時,函數(shù)內(nèi)的this就會指向該對象。因此控制臺會輸出{name: "John"}。
除了call方法,javascript還提供了apply和bind方法來顯式地改變函數(shù)內(nèi)this的指向。比如下面這個例子:
var obj = { name: "John", foo: function() { console.log(this.name); } }; var bar = { name: "Mary" }; var baz = obj.foo.bind(bar); baz();
在上面的例子中,我們使用了bind方法來將obj.foo函數(shù)中的this指向了bar對象。因此控制臺會輸出Mary。
總結(jié)一下,this指的是函數(shù)被調(diào)用時的執(zhí)行上下文。當(dāng)函數(shù)作為對象的方法被調(diào)用時,this指向該對象。當(dāng)函數(shù)被直接調(diào)用時,this指向全局對象。此外,我們還可以通過使用call、apply和bind方法來顯式地改變this的指向。