JavaScript中this指向問題

在嚴格模式下跃赚,全局作用域的函數(shù)中片部,this默認指向 undefined详囤, 這是嚴格模式所規(guī)定的。

// 非嚴格模式下

console.log(this); // Window

function doSomething(){

? ? console.log(this); // Window

}

doSomething(); // 這里可以看成window.doSomething()漓滔,所以函數(shù)里的this指向全局對象window

// 嚴格模式下

'use strict';

console.log(this); // Window

function doInStrict(){

? ? console.log(this); // undefined

}

doInStrict();

對象里的函數(shù),this指向該對象

var a = 1;

var obj = {

? ? a: 2,

? ? fn: function(){

? ? ? ? console.log(this); // {a: 2, fn: ?}

? ? ? ? console.log(this.a); // 2

? ? }

};

obj.fn();

上面函數(shù)被調(diào)用后乖篷,從打印結(jié)果可以看出此時 this 指向的是調(diào)用函數(shù)的對象 obj响驴。如果將對象中的函數(shù)賦給全局對象中定義的變量 fn1,執(zhí)行 fn1 又會出現(xiàn)什么結(jié)果呢撕蔼?

var a = 1;

var obj = {

? ? a: 2,

? ? fn: function(){

? ? ? ? console.log(this); // Winidow

? ? ? ? console.log(this.a); // 1

? ? }

};

var fn1 = obj.fn;

fn1(); // 可以看成window.fn1();

從上面的例子可以看出豁鲤,fn1 與 obj.fn 指向的函數(shù)是相同的,但是調(diào)用它的對象不同鲸沮,那么函數(shù)中 this 的指向也就不一樣了琳骡。

再看一個比較復(fù)雜的例子:

var a = 0;

function fn(){

consoloe.log(this.a);

}

var obj1 = {

a: 1,

fn: function(){

console.log(this.a);

}

};

var obj2 = {

a: 2,

fn: function(){

fn();

obj1.fn();

console.log(this.a);

}

}

obj2.fn();

先說下執(zhí)行結(jié)果,分別打印 0 1 2讼溺。當 obj2 調(diào)用 fn 函數(shù)時日熬,先執(zhí)行的是 fn(),這個函數(shù)是在全局作用域中定義的肾胯,該調(diào)用可以看成 window.fn()竖席,所以,該函數(shù)內(nèi)部的 this 指向的是 window 全局對象敬肚,this.a 自然就是全局對象中的 a 值(0)毕荐。

接著執(zhí)行的是 obj1.fn(),它會從 obj1 中找到 fn 函數(shù)并執(zhí)行艳馒。obj1 中的函數(shù) fn 執(zhí)行時調(diào)用它的對象是 obj1憎亚,所以,此時函數(shù)內(nèi)部的 this 指向的就是 obj1 自身弄慰。那么 this.a 查到的值也就是對象 obj1 中 a 的值(1)第美。

最后打印函數(shù)中 this 所處的函數(shù) fn 是被 obj2 調(diào)用的,那么自然而然 this 就指向了 obj2陆爽,所以 this.a 的結(jié)果就是 2 了什往。

從上面這個例子我們可以看出:函數(shù)內(nèi)部 this 指向跟調(diào)用函數(shù)的對象有關(guān),跟函數(shù)在哪里調(diào)用沒有關(guān)系慌闭。

Window內(nèi)置函數(shù)的回調(diào)函數(shù)中别威,this指向Window對象躯舔。

window 的內(nèi)置函數(shù)( setInterval setTimeout 等),其回調(diào)函數(shù)中的 this 指向的是window對象省古。

var name = 'window';

var obj = {

? ? name: 'obj',

? ? func: function(){

? ? ? ? setTimeout(function () {

? ? ? ? ? ? console.log(this.name) // window

? ? ? ? },1000)

? ? }

}

obj.func()

亞馬遜測評?www.yisuping.com

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粥庄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子豺妓,更是在濱河造成了極大的恐慌惜互,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琳拭,死亡現(xiàn)場離奇詭異训堆,居然都是意外死亡,警方通過查閱死者的電腦和手機臀栈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挠乳,“玉大人权薯,你說我怎么就攤上這事∷铮” “怎么了盟蚣?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卖怜。 經(jīng)常有香客問我屎开,道長,這世上最難降的妖魔是什么马靠? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任奄抽,我火速辦了婚禮,結(jié)果婚禮上甩鳄,老公的妹妹穿的比我還像新娘逞度。我一直安慰自己,他們只是感情好妙啃,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布档泽。 她就那樣靜靜地躺著,像睡著了一般揖赴。 火紅的嫁衣襯著肌膚如雪馆匿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天燥滑,我揣著相機與錄音渐北,去河邊找鬼。 笑死铭拧,一個胖子當著我的面吹牛腔稀,可吹牛的內(nèi)容都是我干的盆昙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼焊虏,長吁一口氣:“原來是場噩夢啊……” “哼淡喜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诵闭,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤炼团,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疏尿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘟芝,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年褥琐,在試婚紗的時候發(fā)現(xiàn)自己被綠了锌俱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡敌呈,死狀恐怖贸宏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情磕洪,我是刑警寧澤吭练,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站析显,受9級特大地震影響鲫咽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谷异,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一分尸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歹嘹,春花似錦寓落、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尖昏,卻和暖如春仰税,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抽诉。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工陨簇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迹淌。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓河绽,卻偏偏與公主長得像己单,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耙饰,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355