this到底是誰(shuí)篮洁?

《你不知道的JavaScript上卷》第二部分第1章-第2章

1.是指向自身嗎钮呀?

var a = 1
function foo() {
    console.log("this.a=", this.a)
}
foo.a = 2;
foo();
console.log("foo.a=", foo.a);
console.log("foo instanceof Object", foo instanceof Object)
// 結(jié)果:
// 瀏覽器環(huán)境下:this.a= 1  foo.a= 2
// node環(huán)境下this.a= undefined  foo.a= 2

我們都知道在JavaScript中Function也是Object,foo instanceof Object的值為true姻檀,所以我們可以給函數(shù)foo添加一個(gè)屬性a,a的值為2涝滴。如果this指向自身的話绣版,foo中this.a的值應(yīng)該是2才對(duì),由此可見this并不指向自身歼疮。
PS:node環(huán)境var聲明并不會(huì)添加到global中杂抽。

2.是指向函數(shù)所在的作用域嗎?

var a = 1;
function foo() {
    var a = 2;
    function bar() {
        console.log("this.a=", this.a);
    }
    bar();
}
foo();
// 結(jié)果:this.a= 1

從第一段代碼我們知道this并不指向自身韩脏,第二段代碼中我們?cè)趂oo函數(shù)的作用域內(nèi)聲明了一個(gè)變量a=2和一個(gè)函數(shù)bar缩麸,并在當(dāng)前作用域內(nèi)執(zhí)行了bar,如果this指向當(dāng)前作用域的話赡矢,bar函數(shù)中this.a的值應(yīng)該是2才對(duì)杭朱,由此可見this也并不指向函數(shù)所在作用域。

結(jié)論:this既不指向自身吹散,也不指向所在作用域弧械,實(shí)際上this是在運(yùn)行時(shí)進(jìn)行綁定的,而不是在編寫的時(shí)候綁定空民。this是在函數(shù)發(fā)生調(diào)用時(shí)發(fā)生的綁定它指向什么完全取決于函數(shù)在哪里被調(diào)用

3.綁定規(guī)則:

1.默認(rèn)綁定

function foo() {
    console.log("this.a=", this.a);
}
var a = 2;
foo();
//結(jié)果:this.a=2
function foo() {
    'use strict'
    console.log("this.a=", this.a);
}
var a = 2;
foo();
// 結(jié)果:TypeError: Cannot read property 'a' of undefined

非嚴(yán)格模式下this綁定到window上梦谜,嚴(yán)格模式會(huì)綁定到undefined

2.隱式綁定

var a = 2;
function foo() {
    console.log("this.a=", this.a);
}
var obj = {
    a: 3,
    foo: foo
}
obj.foo();
//結(jié)果:this.a= 3

對(duì)象屬性引用鏈中只有上一層或者說(shuō)最后一層在調(diào)用位置起作用;

var a = 2;
function foo() {
    console.log("this.a=", this.a);
}
var obj1 = {
    a: 3,
    foo: foo
}
var obj2 = {
    a: 4,
    obj1: obj1
}
obj2.obj1.foo();
//結(jié)果:this.a= 3

3.顯示綁定

常用的綁定方法bind(...),call(...)和apply(...),

var a = 2;
function foo() {
    console.log("this.a=", this.a);
}
var obj = {
    a: 3
}
foo.call(obj);
foo.apply(obj);
var bar = foo.bind(obj);
bar();
//結(jié)果:打印三遍 this.a= 3

4.new綁定

使用new來(lái)調(diào)用函數(shù)時(shí)會(huì)自動(dòng)執(zhí)行以下操作

  1. 創(chuàng)建一個(gè)全新對(duì)象袭景;

  2. 這個(gè)對(duì)象會(huì)被執(zhí)行[[Prototype]]連接;

  3. 這個(gè)新對(duì)象會(huì)被綁定到函數(shù)調(diào)用的this闭树;

  4. 如果函數(shù)沒有返回其他對(duì)象耸棒,那么new表達(dá)式中的函數(shù)調(diào)用會(huì)自動(dòng)返回這個(gè)新對(duì)象;

    var a = 2;
    function foo(a) {
        this.a = a;
    }
    var bar = new foo(3);
    console.log("this.a=",bar.a)
    //結(jié)果:this.a= 3
    

優(yōu)先級(jí)問題

new綁定>顯示綁定>隱式綁定>默認(rèn)綁定

小結(jié):

  1. 由new調(diào)用綁定到新創(chuàng)建的對(duì)象上报辱;
  2. 由bind,call,apply調(diào)用綁定到指定對(duì)象上与殃;
  3. 由上下文對(duì)象調(diào)用綁定到這個(gè)上下文對(duì)象上;
  4. 默認(rèn):在嚴(yán)格模式上綁定到undefined碍现,否則綁定到全局對(duì)象上幅疼;
  5. 箭頭函數(shù)并不會(huì)使用以上規(guī)則,而是根據(jù)當(dāng)前詞法作用域來(lái)決定this昼接,箭頭函數(shù)會(huì)繼承外層函數(shù)調(diào)用的this綁定(無(wú)論this綁定到什么)爽篷。 其實(shí)和ES6之前代碼中的self = this機(jī)制一樣;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慢睡,一起剝皮案震驚了整個(gè)濱河市逐工,隨后出現(xiàn)的幾起案子铡溪,更是在濱河造成了極大的恐慌,老刑警劉巖泪喊,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棕硫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡袒啼,警方通過查閱死者的電腦和手機(jī)哈扮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蚓再,“玉大人滑肉,你說(shuō)我怎么就攤上這事《酝荆” “怎么了赦邻?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)实檀。 經(jīng)常有香客問我惶洲,道長(zhǎng),這世上最難降的妖魔是什么膳犹? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任恬吕,我火速辦了婚禮,結(jié)果婚禮上须床,老公的妹妹穿的比我還像新娘铐料。我一直安慰自己,他們只是感情好豺旬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布钠惩。 她就那樣靜靜地躺著,像睡著了一般族阅。 火紅的嫁衣襯著肌膚如雪篓跛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天坦刀,我揣著相機(jī)與錄音愧沟,去河邊找鬼。 笑死鲤遥,一個(gè)胖子當(dāng)著我的面吹牛沐寺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盖奈,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼混坞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了卜朗?” 一聲冷哼從身側(cè)響起拔第,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咕村,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蚊俺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懈涛,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年泳猬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了批钠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡得封,死狀恐怖埋心,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忙上,我是刑警寧澤拷呆,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站疫粥,受9級(jí)特大地震影響茬斧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梗逮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一项秉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慷彤,春花似錦娄蔼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至跋选,卻和暖如春唉侄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背野建。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恬叹,地道東北人候生。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绽昼,于是被迫代替她去往敵國(guó)和親唯鸭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 目前為止缭付,重名現(xiàn)象很嚴(yán)重啊柿估。北京有個(gè)老王,上海也有個(gè)老王陷猫,雖然他們都叫老王秫舌,但卻是兩個(gè)不同的人,誰(shuí)又知道哪個(gè)才是專...
    NathanYangcn閱讀 145評(píng)論 0 0
  • js中函數(shù)的4中調(diào)用方式 1作為普通函數(shù)來(lái)調(diào)用,this的值指向window绣檬,準(zhǔn)確的說(shuō)this為null足陨,但是被解...
    朝文天下閱讀 416評(píng)論 0 1
  • 1. JS創(chuàng)建變量的5種方式?varletconstfunctionexport/import 2. var娇未,le...
    Angel_6c4e閱讀 818評(píng)論 0 13
  • JavaScript 中的 new墨缘、bind、call零抬、apply 實(shí)際這些都離不開 this镊讼,因此本文將著重討論...
    金色888閱讀 152評(píng)論 0 0
  • 一、你不知道的JavaScript 1媚值、作用域 作用域 LHS RHS RHS查詢與簡(jiǎn)單地查找某個(gè)變量的值別無(wú)二...
    頂兒響叮當(dāng)閱讀 346評(píng)論 0 0