對JavaScript中this & 上下文的理解

context --> what the value of this is

1. 首先我們執(zhí)行console.log(this);异袄,即在全局作用域內(nèi)輸出this的值:

  • 在node環(huán)境下柠新,輸出{}

  • 在瀏覽器環(huán)境下株旷,輸出Window {....}

2. 接著我們看下面一段代碼:

function foo() {
  console.log(this);
}
foo();
  • 在node環(huán)境下扇雕,輸出Object [global] {...}

  • 在瀏覽器環(huán)境下吓肋,輸出Window {...}

--> by default, a function runs within the scope of the object that it sits in.

因此上一段代碼中的foo();等同于window.foo();

(when you create something in the root scope, it's a part of the window object

3. 接著看下面一段代碼

var obj = {
  foo: function () {
    console.log(this);
    console.log(this === obj);
  }
};
obj.foo();

輸出結果為

{ foo: [Function: foo] }
true

當函數(shù)是作為對象的屬性存在并調(diào)用時签孔,函數(shù)中的this指對象,否則thiswindowstrict模式下thisundefined


思考題:

1. 下面代碼輸出結果是什么

var name = 'red';

function a() {
  const name = 'white';
  console.log(this.name);
}

function d(i) {
  return i();
}

const b = {
  name: 'yellow',
  detail: function () {
    console.log(this.name);
  },
  hello: function () {
    return function () {
      console.log(this.name);
    }
  } 
};

var name = 'The Window';

var object = {
  name: 'My Object',
  getNameFunc: function () {
    var that = this;
    return function () {
      return that.name;
    };
  }
};

const c = b.detail;              // line 1
b.a = a;                         // line 2
const e = b.hello();             // line 3

a();                             // line 5
c();                             // line 6
b.a();                           // line 7
d(b.detail);                     // line 8
e();                             // line 9
object.getNameFunc()();          // line 10 

由標注的line1開始讀:

  • line 1: --> 相當于創(chuàng)建一個全局作用域下的函數(shù)c华临,函數(shù)cb.detail指向同一個函數(shù)語句芯杀,即console.log(this.name);

  • line 2: --> 相當于給對象b添加一個新的屬性a,屬性a對應的值與函數(shù)a指向同一個函數(shù)語句雅潭,即const name = 'white'; console.log(this.name);揭厚,此時對象b為

{
  name: 'yellow',
  detail: [Function: detail],
  hello: [Function: hello],
  a: [Function: a]
}
  • line 3: --> 相當于創(chuàng)建一個全局作用域下的函數(shù)e,并將b.hello()的函數(shù)返回值function () {console.log(this.name);}賦給e

  • line 5: --> a()是在window對象下運行扶供,全局作用域內(nèi)最后一次給name賦值為'The Window'筛圆,因此this.namewindow.name, 即'The Window'(node環(huán)境下輸出undefined-->當輸出一個對象中不存在的屬性時,輸出值為undefined

  • line 6: --> c()也是在window對象下運行椿浓,this同樣指window太援,輸出'The Window'(node環(huán)境下輸出undefined

  • line 7: --> b.a();b對象下運行,this.nameb.name扳碍,輸出'yellow'

  • line 8: --> 由于d是一個在全局作用域下定義的函數(shù)提岔,因此將b.detail所指向的函數(shù)語句放在全局對象執(zhí)行,this指window笋敞,輸出'The Window'(node環(huán)境下輸出undefined

  • line 9: --> 由于e是一個在全局作用域下定義的函數(shù)碱蒙,this指window,輸出'The Window'(node環(huán)境下輸出undefined

  • line 10: --> 返回值為'My Object'(但不打印結果)液样。原因:由于在object對象下執(zhí)行了var that = this;振亮, 因此that === object巧还,即函數(shù)返回值為object.name鞭莽,即'My Object'

2. 下面代碼輸出結果是什么

myobject.func();

var myobject = {
  foo: 'bar',
  func: function () {
    var self = this;             // line 1
    console.log(this.foo);       // line 2
    console.log(self.foo);       // line 3
    (function (){                // line 4
      console.log(this.foo);     // line 5
      console.log(self.foo);     // line 6
    })();
    function f() {               // line 8
      console.log(this.foo);
    }
    f();                         // line 11
  }
}
  • line 1: --> thismyobject,因此self也指myobject

  • line 2: --> 打印myobject.foo麸祷,即打印'bar'

  • line 3: --> 打印myobject.foo澎怒,即打印'bar'

  • line 4: --> 該立即執(zhí)行函數(shù)并不是作為特定對象的屬性存在并調(diào)用

  • line 5: --> this.foo默認為window.foo,全局對象不存在foo這個屬性,因此打印undefined

  • line 6: --> 打印self.foo即打印myobject.foo喷面,即打印'bar'

  • line 8: --> 函數(shù)f并不是作為特定對象的屬性存在并調(diào)用

  • line 11: --> this.foo默認為window.foo星瘾,全局對象不存在foo這個屬性,因此打印undefined

3. 下面代碼輸出結果是什么?

var myobject = {
  foo: 'bar',
  func: (function () {
    var self = this;
    console.log(this.foo);
    console.log(self.foo);

    (function () {
      console.log(this.foo);
      console.log(self.foo);
    })();
    function f() {
      console.log(this.foo);
    }
    f();
  })()
};

(function () {...})()并不是作為特定對象的屬性存在并調(diào)用惧辈, this.foo默認為window.foo琳状,全局對象不存在foo這個屬性,因此打印五個undefined

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盒齿,一起剝皮案震驚了整個濱河市念逞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌边翁,老刑警劉巖翎承,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異符匾,居然都是意外死亡叨咖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門啊胶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甸各,“玉大人,你說我怎么就攤上這事焰坪〕栈蓿” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵琳彩,是天一觀的道長誊酌。 經(jīng)常有香客問我,道長露乏,這世上最難降的妖魔是什么碧浊? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮瘟仿,結果婚禮上箱锐,老公的妹妹穿的比我還像新娘。我一直安慰自己劳较,他們只是感情好驹止,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著观蜗,像睡著了一般臊恋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上墓捻,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天抖仅,我揣著相機與錄音,去河邊找鬼。 笑死撤卢,一個胖子當著我的面吹牛环凿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播放吩,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼智听,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了渡紫?” 一聲冷哼從身側響起瞭稼,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腻惠,沒想到半個月后环肘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡集灌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年悔雹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欣喧。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡腌零,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唆阿,到底是詐尸還是另有隱情益涧,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布驯鳖,位于F島的核電站闲询,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏浅辙。R本人自食惡果不足惜扭弧,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望记舆。 院中可真熱鬧鸽捻,春花似錦、人聲如沸泽腮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诊赊。三九已至厚满,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豪筝,已是汗流浹背痰滋。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工摘能, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留续崖,地道東北人敲街。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像严望,于是被迫代替她去往敵國和親多艇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355