久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

一文聊聊Javascript中的執(zhí)行上下文

本篇文章帶大家聊聊Javascript中的執(zhí)行上下文,分享一個思考題,通過對思考題的分析,想必會對執(zhí)行上下文有更加深入的理解。

一文聊聊Javascript中的執(zhí)行上下文

在前面的幾篇文章中,我們深入了解了關(guān)于執(zhí)行上下文的三個重要成員:變量對象、作用域鏈和 this ,本篇文章是前四篇文章的的內(nèi)容的集合,聚合分散的知識點,做一個簡單的鞏固。不知道有沒有人是上一篇來的,我們的上一篇留下了一個思考題,通過對思考題的分析,想必會對執(zhí)行上下文有更加深入的理解。

思考題

這里為了稍微將案例復(fù)雜化一點,做了一點點修改,但是并沒有改變原題所考察的點。

function func(value){     getValue = function(){         console.log(value);     };     return this }              function getValue(){     console.log(5); }  Func(1).getValue(); //為什么是1呢?
登錄后復(fù)制

具體執(zhí)行分析

執(zhí)行全局代碼,創(chuàng)建全局執(zhí)行上下文,全局上下文被壓入執(zhí)行上下文棧

ECStack = [ globalContext ];
登錄后復(fù)制

登錄后復(fù)制

初始化全局上下文

globalContext = {     VO: {         func: reference to function func(){},         getValue: reference to function getValue(){}     },     Scope: [globalContext.VO],     this: globalContext.VO //全局上下文 }
登錄后復(fù)制

初始化全局上下文同時創(chuàng)建了兩個函數(shù),因此也會保存他們父級作用域鏈在他們的內(nèi)部屬性 [[scope]] 內(nèi)

func.[[scope]] = [      globalContext.VO ]; getValue.[[scope]] = [      globalContext.VO ];
登錄后復(fù)制

此時開始執(zhí)行代碼,執(zhí)行到最后的語句時先執(zhí)行 func 函數(shù),也就創(chuàng)建按步驟 func 函數(shù)執(zhí)行上下文:

  • 復(fù)制函數(shù) [[scope]] 屬性創(chuàng)建作用域鏈

  • 用 arguments 創(chuàng)建活動對象

  • 初始化活動對象

  • 將活動對象壓入 checksfunccope 作用域鏈頂端。

  • 創(chuàng)建this,簡單分析:MemberExpression 值為func,func是一個函數(shù)對象,理所當(dāng)然是一個Reference ,其中它的 base value 是 EnvironmentRecord ,所以它的 this 值為 ImplicitThisValue(ref),返回值始終是 undefined ,非嚴(yán)格模式下,其值會被隱式轉(zhuǎn)換為全局對象。

funcContext = {     AO: {         arguments: { // 數(shù)組             0: 1,             length: 1         }     },     Scope: [AO, globalContext.VO],     this: undefined }
登錄后復(fù)制

可能有人會有疑問,func 里的 getValue 呢?,因為它并沒有變量申明,因此他其實是一個屬性的賦值操作,在后面運行時才會被執(zhí)行。

創(chuàng)建函數(shù)執(zhí)行上下文后壓入執(zhí)行上下文棧

    ECStack = [         funcContext,         globalContext     ];
登錄后復(fù)制

函數(shù)開始執(zhí)行,此時就是為什么最后輸出是1的關(guān)鍵了,第一句賦值操作,那么就需要沿著執(zhí)行上下文去找變量 getValue,那么我們就來看 funcContext 中的作用域,首先找到 funcContext.AO 顯然并不存在 getValue 這一屬性,那么沿著作用域鏈往上找,找到了globalContext.VO ,找到了 getValue ,這時候就會給全局作用域下的 getValue 屬性重新賦值,賦的是一個函數(shù)的傳新版本,也就重新創(chuàng)建了函數(shù)作用域,將這個全新的 getValue 函數(shù)的父級作用域鏈保存在它在他們的內(nèi)部屬性 [[scope]] 內(nèi):

getValue .[[scope]] = [ funcContext.AO, globalContext.VO ];
登錄后復(fù)制

然后才繼續(xù)返回 this ,查找 funcContext 的 this ,即返回undefined;func 執(zhí)行上下文出棧

ECStack = [ globalContext ];
登錄后復(fù)制

登錄后復(fù)制

繼續(xù)執(zhí)行Func(1).getValue(),前半部分返回了 undefined ,此時系統(tǒng)隱式轉(zhuǎn)換為全局變量對象,從全局變量對象中找到 getValue 屬性。這時候我們發(fā)現(xiàn) getValue 早已不是當(dāng)年那個少年,執(zhí)行全新的 getValue 的函數(shù)執(zhí)行上下文并入棧:

getValueContext = {     AO: {         arguments: { // 數(shù)組             length: 0         }     },     Scope: [ AO, funcContext.AO, globalContext.VO ],     this: undefined } ECStack = [     getValueContext,     globalContext  ];
登錄后復(fù)制

函數(shù)開始執(zhí)行,發(fā)現(xiàn)她要輸出 value ,沿著作用域去找,getValueContext.AO 中并沒有這個屬性, 繼續(xù)往下找找到 funcContext.AO(注意! ),在形參中 找到了 value 那么就輸出對樣的值,也就輸出了1。

函數(shù)執(zhí)行完畢,getValueContext 和 globalContext 相繼出棧并銷毀,代碼運行完畢。

總結(jié)

本片以一個簡單但又不簡單的示例,將前面的四篇文章串聯(lián)起來,完整地分析了JS代碼執(zhí)行時執(zhí)行上下文的工作過程,希望大家對此能有更深的理解。但是,不知道有沒有細心的同學(xué)發(fā)現(xiàn),上面的示例中,執(zhí)行 getValue 函數(shù)的過程中,由尋找屬性 value的步驟(標(biāo)記位置),那個時候 func 函數(shù)明明已經(jīng)執(zhí)行完畢了,他的執(zhí)行上下文已經(jīng)出棧了,為什么還能從他的執(zhí)行上下文中找到 value 屬性呢?這其實就是閉包產(chǎn)生的原理了,下一篇我們?nèi)匀挥眠@個示例去學(xué)習(xí)閉包產(chǎn)生的原理。

【推薦學(xué)習(xí):javascript高級教程】

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
欧美精品aa| 欧美在线不卡| 日本高清不卡一区二区三区视频| 国产精品videossex| 久久中文字幕导航| 毛片在线网站| 99视频精品视频高清免费| 91成人网在线观看| 亚州av一区| 另类小说一区二区三区| 成人精品天堂一区二区三区| 精品一区毛片| 日韩中文字幕在线一区| 国产高清视频一区二区| 欧美天堂视频| 自拍日韩欧美| 国产日韩免费| 午夜久久中文| 国产99久久久国产精品成人免费| 日韩中文欧美在线| 麻豆高清免费国产一区| 国产精品99一区二区| 亚洲乱码一区| 极品av在线| 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品丝袜在线播放| 欧美亚洲在线日韩| 国产亚洲一区二区三区不卡| 欧美国产小视频| 男女精品网站| 久久亚州av| 免费在线成人网| 六月婷婷综合| 日韩一区精品| 91精品一区国产高清在线gif | 欧洲亚洲一区二区三区| 香蕉精品999视频一区二区| 国产探花一区在线观看| 久久婷婷一区| 日韩激情啪啪| 欧美日韩国产高清电影| 国产极品嫩模在线观看91精品| 欧美搞黄网站| 国产精品一二| 在线综合欧美| 一本大道色婷婷在线| 日本欧美在线| 国产模特精品视频久久久久| 高清在线一区| 国产调教精品| 蜜臀av一区二区在线免费观看| av资源亚洲| 久久99影视| 亚洲91网站| 蜜臀久久99精品久久一区二区| 精品国内亚洲2022精品成人| 最新国产精品久久久| 久久国产亚洲精品| 国产精品久久久亚洲一区| 日韩在线观看一区二区| 香蕉精品久久| 亚洲不卡系列| 亚洲深夜视频| 麻豆国产欧美日韩综合精品二区| 亚洲精品裸体| 美女91精品| 亚洲一区亚洲| 欧美日韩国产高清| 激情欧美亚洲| 亚洲v在线看| 日本在线啊啊| 国产不卡av一区二区| 国产伦精品一区二区三区视频| 在线观看一区| 免费成人性网站| 中文日韩在线| 亚洲欧洲另类| 国产毛片久久| 久久夜色精品| 免费人成精品欧美精品| 亚洲欧美日韩专区| 中文国产一区| 亚洲欧美视频| 三级亚洲高清视频| 一区二区三区四区日韩| 热久久免费视频| 亚洲综合激情在线| 色8久久久久| 色8久久久久| 日韩精品免费视频一区二区三区 | 亚洲中午字幕| 男女性色大片免费观看一区二区 | 老司机精品在线| 美女视频免费精品| 精品三级国产| 亚洲va中文在线播放免费| 久久久久久久久久久9不雅视频| 黄色精品网站| 精品在线99| 中文一区一区三区免费在线观 | 日韩国产欧美在线播放| 日韩1区2区日韩1区2区| 欧美午夜三级| 开心激情综合| 久久久久国产| 免播放器亚洲一区| 国产精品一区二区美女视频免费看 | 久久成人精品| 青青国产91久久久久久| 国产精品久av福利在线观看| 精品日本视频| 国产字幕视频一区二区| 免费一级片91| 国产亚洲精品美女久久| 欧美日韩夜夜| а√天堂8资源在线| 久久视频一区| 蜜臀久久99精品久久久久宅男 | 久久大逼视频| 国产免费播放一区二区| 国产在线观看www| 91久久视频| 欧美一区91| 欧美丰满日韩| 中文字幕免费一区二区| 精品国产一区二区三区av片| 亚洲精品88| 一区二区国产在线观看| 加勒比视频一区| 亚洲精品1区| 国产精品手机在线播放| 国产综合激情| 欧美亚洲自偷自偷| 欧美gv在线| 欧美永久精品| 久久人人88| 国产欧美日韩综合一区在线播放| 欧美天堂视频| 日韩激情啪啪| 999久久久91| 国产精品午夜av| 亚洲不卡系列| 日韩精品免费一区二区夜夜嗨 | 国产精品2023| 在线亚洲观看| 丰满少妇一区| 蜜桃视频一区二区三区| 毛片在线网站| 欧美日韩一区二区三区不卡视频 | 国模精品一区| 亚洲丝袜美腿一区| 中文在线资源| 亚洲日本国产| 裤袜国产欧美精品一区| 欧美一区成人| 亚洲欧洲日本mm| 国产精品xx| 国产欧美日韩免费观看| 欧美日韩精品一本二本三本| 精品视频在线你懂得| 蜜臀va亚洲va欧美va天堂 | 中文在线资源| 国产日韩一区二区三区在线| 欧美日韩国产在线一区| 国产精品二区不卡| 欧美日韩1区2区3区| 99久久99久久精品国产片果冰 | 美女精品在线观看| 亚洲一区资源| 欧美激情福利| 久久激情五月婷婷| 日韩在线播放一区二区| 国产精品7m凸凹视频分类| 成人亚洲精品| 国产精品久久久亚洲一区| 亚洲精品免费观看| 每日更新成人在线视频| 亚洲www啪成人一区二区| 欧美激情网址| 国产精品亚洲欧美日韩一区在线| 久久成人精品| 日韩视频在线一区二区三区 | 欧美成人精品三级网站| 欧美片网站免费| 亚洲人亚洲人色久| 视频一区二区三区中文字幕| 不卡在线一区二区| 国精品一区二区| 欧美一级精品| 欧美中文字幕一区二区| 久久久蜜桃一区二区人| 午夜av成人| 欧美在线观看视频一区| 久久要要av| 亚洲福利专区| 精品中文字幕一区二区三区av| 伊人久久大香线蕉av不卡| 日韩精品电影| 色爱综合网欧美| 精品美女视频|