Javascript執(zhí)行上下文、this赔硫、作用域

前置:重要事情說三遍:執(zhí)行上下文和作用域不一樣炒俱!不一樣!不一樣爪膊!

1权悟、執(zhí)行上下文和作用域之間最大的區(qū)別是:

執(zhí)行上下文在運(yùn)行時(shí)確定,隨時(shí)可能改變推盛;作用域在定義時(shí)確定僵芹,永遠(yuǎn)不會(huì)改變。

2小槐、每個(gè)執(zhí)行上下文都有三個(gè)重要的屬性拇派,變量對(duì)象(Variable object,VO)凿跳,作用域鏈(Scope chain)和this件豌,當(dāng)然還有一些附加的屬性。

實(shí)例控嗜、

? ?var a=1;//全局作用域? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ?function fn1(){

? ?var a=2; //fn1作用域

? ? }

?this.a=1;//全局執(zhí)行上下文 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?function fn1(){

this.a=2; //fn1執(zhí)行上下文

}

var obj=new fn1();


一茧彤、執(zhí)行上下文

綜述:每次當(dāng)控制器轉(zhuǎn)到可執(zhí)行代碼的時(shí)候,就會(huì)進(jìn)入一個(gè)執(zhí)行上下文疆栏。執(zhí)行上下文可以理解為當(dāng)前代碼的執(zhí)行環(huán)境曾掂,它會(huì)形成一個(gè)作用域。JavaScript中的運(yùn)行環(huán)境大概包括三種情況壁顶。

1珠洗、全局環(huán)境:JavaScript代碼運(yùn)行起來會(huì)首先進(jìn)入該環(huán)境

2、函數(shù)環(huán)境:當(dāng)函數(shù)被調(diào)用執(zhí)行時(shí)若专,會(huì)進(jìn)入當(dāng)前函數(shù)中執(zhí)行代碼

3许蓖、eval

在一個(gè)JavaScript程序中,必定會(huì)產(chǎn)生多個(gè)執(zhí)行上下文,JavaScript引擎會(huì)以堆棧的方式來處理它們膊爪。棧永遠(yuǎn)都是全局上下文自阱,而棧就是當(dāng)前正在執(zhí)行的上下文。

當(dāng)代碼在執(zhí)行過程中米酬,遇到以上三種情況沛豌,都會(huì)生成一個(gè)執(zhí)行上下文,放入棧中赃额,而處于棧頂?shù)纳舷挛膱?zhí)行完畢之后加派,就會(huì)自動(dòng)出棧

(1)變量對(duì)象VO和活動(dòng)對(duì)象AO

變量對(duì)象VO是與執(zhí)行上下文相關(guān)的特殊對(duì)象,用來存儲(chǔ)上下文的函數(shù)聲明爬早,函數(shù)形參和變量哼丈。在global全局上下文中,變量對(duì)象也是全局對(duì)象自身筛严;在函數(shù)執(zhí)行上下文中媒咳,VO是不能直接訪問的六水,此時(shí)由活動(dòng)對(duì)象(activation object,縮寫為AO)扮演VO的角色喂柒。

變量對(duì)象VO存儲(chǔ)上下文中聲明的以下內(nèi)容

{

}

二砚嘴、this

this代表了當(dāng)前對(duì)象的一個(gè)引用。

1照瘾、this指代全局

var name ="global this";

functionglobalTest() {

console.log(this.name);?

?}?

?globalTest();//global this

2匈棘、this指代構(gòu)造函數(shù)

var name ="global name";

function showName() {? ?//構(gòu)造函數(shù)

this.name ="showName function";?

?}

var obj =new showName();

console.log(obj.name);? //showName?

functionconsole.log(name);? //global name

3、指向某個(gè)對(duì)象

如果函數(shù)作為對(duì)象的方法調(diào)用析命,this指向的是這個(gè)上級(jí)對(duì)象主卫,即調(diào)用方法的對(duì)象

function? showName() {? ?//普通函數(shù)

console.log(this.name);?

?}

var obj = {};?

?obj.name ="ooo";?

?obj.show = showName;?

?obj.show();? //ooo

4、apply/call調(diào)用時(shí)的this

apply和call都是為了改變函數(shù)體內(nèi)部的this指向鹃愤。

call(thisObj簇搅,Object)? ?;apply(thisObj软吐,[argArray])

var value ="Global value";

functionFunA() {

this.value ="AAA";?

?}

functionFunB()?{

console.log(this.value);

?}?

?FunB();? ? ? ? ?//Global value 因?yàn)槭窃谌种姓{(diào)用的FunB(),this.value指向全局的value FunB.call(window);? ? ? ? //Global value,this指向window對(duì)象瘩将,因此this.value指向全局的value FunB.call(new FunA());? ? ? ? ?//AAA, this指向參數(shù)new FunA(),即FunA對(duì)象 FunB.apply(window);? ? ? ? ? ?//Global value FunB.apply(new FunA());//AAA

三凹耙、作用域

首先姿现,js只有函數(shù)作用域(function-based),沒有塊級(jí)作用域肖抱,也就是只有函數(shù)會(huì)有自己的作用域备典,其他都沒有。

接著虐沥,作用域分為全局作用域與局部作用域熊经。

全局作用域中的對(duì)象可以在代碼的任何地方訪問泽艘,一般來說欲险,下面情況的對(duì)象會(huì)在全局作用域中:

最外層函數(shù)和在最外層函數(shù)外面定義的變量

沒有通過關(guān)鍵字"var"聲明的變量

瀏覽器中镐依,window對(duì)象的屬性

局部作用域又被稱為函數(shù)作用域(Function scope),所有的變量和函數(shù)只能在作用域內(nèi)部使用天试。


參考:https://www.cnblogs.com/nanchen/p/6055016.html

? ? ? ? ? https://www.cnblogs.com/lsgxeva/p/7975669.html

? ? ? ? ? http://www.reibang.com/p/edb2be5866eb

? ? ? ? ?https://blog.csdn.net/github_34514750/article/details/52901781

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末槐壳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子喜每,更是在濱河造成了極大的恐慌务唐,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件带兜,死亡現(xiàn)場(chǎng)離奇詭異枫笛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)刚照,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門刑巧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人无畔,你說我怎么就攤上這事啊楚。” “怎么了浑彰?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵恭理,是天一觀的道長。 經(jīng)常有香客問我郭变,道長颜价,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任诉濒,我火速辦了婚禮周伦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘循诉。我一直安慰自己横辆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布茄猫。 她就那樣靜靜地躺著狈蚤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪划纽。 梳的紋絲不亂的頭發(fā)上脆侮,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音勇劣,去河邊找鬼靖避。 笑死潭枣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的幻捏。 我是一名探鬼主播盆犁,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼篡九!你這毒婦竟也來了谐岁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤榛臼,失蹤者是張志新(化名)和其女友劉穎伊佃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沛善,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡航揉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了金刁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帅涂。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胀葱,靈堂內(nèi)的尸體忽然破棺而出漠秋,到底是詐尸還是另有隱情,我是刑警寧澤抵屿,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布庆锦,位于F島的核電站,受9級(jí)特大地震影響轧葛,放射性物質(zhì)發(fā)生泄漏搂抒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一尿扯、第九天 我趴在偏房一處隱蔽的房頂上張望求晶。 院中可真熱鬧,春花似錦衷笋、人聲如沸芳杏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爵赵。三九已至,卻和暖如春泊脐,著一層夾襖步出監(jiān)牢的瞬間空幻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工容客, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秕铛,地道東北人约郁。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像但两,于是被迫代替她去往敵國和親鬓梅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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