JavaScript 中 this 的詳解

this 的指向

this 是 js 中定義的關(guān)鍵字,它自動(dòng)定義于每一個(gè)函數(shù)域內(nèi),但是它的指向卻讓人很迷惑。在實(shí)際應(yīng)用中,this 的指向大致可以分為以下四種情況。

1.作為普通函數(shù)調(diào)用

當(dāng)函數(shù)作為一個(gè)普通函數(shù)被調(diào)用,this 指向全局對(duì)象。在瀏覽器里,全局對(duì)象就是 window。

window.name = 'linxin';
function getName(){
    console.log(this.name);
}
getName();                   // linxin

可以看出,此時(shí) this 指向了全局對(duì)象 window。
在ECMAScript5的嚴(yán)格模式下,這種情況 this 已經(jīng)被規(guī)定不會(huì)指向全局對(duì)象了,而是 undefined。

'use strict';
function fun(){
    console.log(this);
}
fun();                      // undefined

2.作為對(duì)象的方法調(diào)用

當(dāng)函數(shù)作為一個(gè)對(duì)象里的方法被調(diào)用,this 指向該對(duì)象

var obj = {
    name : 'linxin',
    getName : function(){
        console.log(this.name);
    }
}

obj.getName();              // linxin

如果把對(duì)象的方法賦值給一個(gè)變量,再調(diào)用這個(gè)變量:

var obj = {
    fun1 : function(){
        console.log(this);
    }
}
var fun2 = obj.fun1;
fun2();                     // window

此時(shí)調(diào)用 fun2 方法 輸出了 window 對(duì)象,說(shuō)明此時(shí) this 指向了全局對(duì)象。給 fun2 賦值,其實(shí)是相當(dāng)于:

var fun2 = function(){
    console.log(this);
}

可以看出,此時(shí)的 this 已經(jīng)跟 obj 沒(méi)有任何關(guān)系了。這時(shí) fun2 是作為普通函數(shù)調(diào)用。

3.作為構(gòu)造函數(shù)調(diào)用

js中沒(méi)有類,但是可以從構(gòu)造器中創(chuàng)建對(duì)象,并提供了 new 運(yùn)算符來(lái)進(jìn)行調(diào)用該構(gòu)造器。構(gòu)造器的外表跟普通函數(shù)一樣,大部分的函數(shù)都可以當(dāng)做構(gòu)造器使用。當(dāng)構(gòu)造函數(shù)被調(diào)用時(shí),this 指向了該構(gòu)造函數(shù)實(shí)例化出來(lái)的對(duì)象。

var Person = function(){
    this.name = 'linxin';
}
var obj = new Person();
console.log(obj.name);      // linxin

如果構(gòu)造函數(shù)顯式的返回一個(gè)對(duì)象,那么 this 則會(huì)指向該對(duì)象。

var Person = function(){
    this.name = 'linxin';
    return {
        name : 'linshuai'
    }
}
var obj = new Person();
console.log(obj.name);      // linshuai

如果該函數(shù)不用 new 調(diào)用,當(dāng)作普通函數(shù)執(zhí)行,那么 this 依然指向全局對(duì)象。

4.call() 或 apply() 調(diào)用

通過(guò)調(diào)用函數(shù)的 call() 或 apply() 方法可動(dòng)態(tài)的改變 this 的指向。

var obj1 = {
    name : 'linxin',
    getName : function(){
        console.log(this.name);
    }
}
var obj2 = {
    name : 'linshuai'
}

obj1.getName();             // linxin
obj1.getName.call(obj2);    // linshuai
obj1.getName.apply(obj2);   // linshuai

這兩個(gè)方法在js中都是非常常用的方法,可以閱讀下一篇:javascript 中 apply 、call 的詳解。

更多文章:lin-xin/blog

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. this之謎 在JavaScript中,this是當(dāng)前執(zhí)行函數(shù)的上下文。因?yàn)镴avaScript有4種不同的...
    百里少龍閱讀 1,093評(píng)論 0 3
  • 前言 總括:詳解JavaScript中的this的一篇總結(jié),不懂this這個(gè)難點(diǎn),很多時(shí)候會(huì)造成一些困擾,寫(xiě)出一些...
    秦至閱讀 623評(píng)論 0 4
  • javascript里的this指針邏輯上的概念也是實(shí)例化對(duì)象,這一點(diǎn)和java語(yǔ)言里的this指針是一致的,但是...
    天外來(lái)人閱讀 530評(píng)論 0 0
  • 很多年了 我履袍輕霜,孑孑獨(dú)行 一腔熱血拋灑,潤(rùn)不出萬(wàn)朵桃花 半生風(fēng)云叱咤,只換得漫天黃沙 把三千繁華逐水...
    木薇清閱讀 1,554評(píng)論 22 49
  • 從知道笑來(lái)老師的“付費(fèi)就是撿便宜”這個(gè)認(rèn)知后,我就開(kāi)始了線上付費(fèi)之旅,只要是我感興趣的課程,不管費(fèi)用多么昂貴,哪怕...
    林子醬閱讀 391評(píng)論 4 2

友情鏈接更多精彩內(nèi)容