电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

詳解JavaScript中的執(zhí)行上下文及調(diào)用堆棧

瀏覽:45日期:2023-06-05 16:46:16
一、執(zhí)行上下文是什么

代碼運行是在一定的環(huán)境之中運行的,這個運行環(huán)境我們就成為執(zhí)行環(huán)境,也就是執(zhí)行上下文,按照執(zhí)行環(huán)境不同,我們可以分為三類:

全局執(zhí)行環(huán)境:代碼首次執(zhí)行時候的默認(rèn)環(huán)境

函數(shù)執(zhí)行環(huán)境:每當(dāng)執(zhí)行流程進入到一個函數(shù)體內(nèi)部的時候

Eval執(zhí)行環(huán)境:當(dāng)eval函數(shù)內(nèi)部的文本執(zhí)行的時候

二、執(zhí)行上下文棧是什么

既然是‘棧’,那就得符合‘棧’的特性,即數(shù)據(jù)結(jié)構(gòu)是先進后出。下面我們看一段代碼:

function cat(a){ if(a<0){return false; } console.log(’入棧:’+a); cat(a-1); console.log(’出棧:’+a);}cat(3);// 入棧:3// 入棧:2// 入棧:1// 入棧:0// 出棧:0// 出棧:1// 出棧:2// 出棧:3

我們來分析上面的代碼的執(zhí)行過程:

①瀏覽器加載時,程序進入全局執(zhí)行上下文,將其壓入一個棧內(nèi)(第一個進入的,所以最底層);該執(zhí)行上下文下只有一個函數(shù)cat、cat調(diào)用、參數(shù)3;

②程序進入cat函數(shù)內(nèi),即進入該函數(shù)執(zhí)行上下文,也將其壓入棧內(nèi)(第二個進入的,所以倒數(shù)第二層),因為參數(shù)為3大于0,繼續(xù)往下執(zhí)行,輸出’入棧:3’;

③程序繼續(xù)執(zhí)行,調(diào)用函數(shù)cat,再次進入新的函數(shù)執(zhí)行上下文,繼續(xù)壓入棧內(nèi)(第三個進入,倒數(shù)第三層),參數(shù)為a-1,循環(huán)②步驟;這里,需要注意的是,因為調(diào)用了函數(shù)cat(a-1),導(dǎo)致下一行代碼’出棧:a’(此時a仍為3),也就是’出棧:3’暫時擱淺起來,存在棧內(nèi)倒數(shù)第二層

④不斷重復(fù)②③步驟,以次輸出’入棧:2’、’入棧:1’、’入棧:0’;同時被擱淺的有’出棧:2’(棧內(nèi)倒數(shù)第三層)、’出棧:1(棧內(nèi)倒數(shù)第四層)’、’出棧:0(棧內(nèi)倒數(shù)第五層)’;

⑤按照棧的特性,被擱淺起來的4個輸出項:以次輸出’入棧:3’、’入棧:2’、’入棧:1’、’入棧:0’;以上就是執(zhí)行上下文棧的具體情況,請大家手動代碼練習(xí)一下,相信會容易理解透徹。

詳解JavaScript中的執(zhí)行上下文及調(diào)用堆棧

三、執(zhí)行上下文棧的過程細(xì)節(jié)

我們已經(jīng)知道,每次調(diào)用函數(shù)都會執(zhí)行一個新的上下文,每個執(zhí)行上下文都分為兩個階段:創(chuàng)建階段、執(zhí)行階段創(chuàng)建階段:指的是程序調(diào)用函數(shù),但代碼未執(zhí)行時的階段;執(zhí)行階段:指的是變量分配、函數(shù)執(zhí)行等代碼執(zhí)行階段;

(一)創(chuàng)建階段

該階段會調(diào)用函數(shù)數(shù)時,創(chuàng)建一個執(zhí)行上下文對象(executionContextObj),該對象又包含了三個對象,分別是作用域鏈對象(scopeChain)、變量對象(variableObject,簡稱VO)、this對象,其中VO包括變量聲明(variable)、函數(shù)聲明(function)、參數(shù)(arguments)等。這三個對象分別是在三個步驟創(chuàng)建的:步驟1:初始化作用域鏈(scopeChain),開辟棧內(nèi)存

步驟2:創(chuàng)建參數(shù)、函數(shù)、變量

步驟3:決定上下文的’this’的值

結(jié)合代碼來進一步分析一下上面的步驟:

function cat(name) { var a = ’年年’; var b = function () {}; this.name = name; function c() {console.log(this.name); } c();}cat(’有魚’);

這段代碼在調(diào)用函數(shù) cat(’有魚’)時,執(zhí)行上下文是處于 創(chuàng)建階段的,代碼解析為:

cat執(zhí)行上下文對象 = { scopeChain: { ... },// 1.創(chuàng)建作用域鏈,開辟棧內(nèi)存 variableObject: { 2.創(chuàng)建變量對象arguments: { // 2.1 解析參數(shù) 0: ’有魚’, length: 1},name: ’有魚’, // 2.1 解析參數(shù),創(chuàng)建形參名稱,并進行參數(shù)賦值c: function c() // 2.2 找到函數(shù)聲明c,并將c作為屬性,function c作為值a: undefined, // 2.3 找到變量聲明a,初始化為undefined,該階段只看聲明部分,不進行賦值b: undefined // 2.3 找到變量聲明b,初始化為undefined,該階段只看聲明部分,不進行賦值 }, this: { 3.創(chuàng)建this對象this:cat(’有魚’) // 3.1 指向此次調(diào)用的對象name:undefined // 3.2 對象屬性name的初始化為undefined }; c() //又進入函數(shù)c執(zhí)行上下文,跟cat函數(shù)一樣,暫不展開 }

通過代碼解析我們可以得出以下結(jié)論

①三個步驟順序不能亂②VO步驟內(nèi),先執(zhí)行函數(shù)聲明,再執(zhí)行變量聲明③只有參數(shù)可以在此階段進行賦值,變量、函數(shù)都只能聲明

詳解JavaScript中的執(zhí)行上下文及調(diào)用堆棧

(二)執(zhí)行階段

該階段js解釋器執(zhí)行上下文中的函數(shù)代碼,逐行運行js代碼,并給變量賦值;還是結(jié)合代碼來分析:

cat執(zhí)行上下文對象 = { scopeChain: { ... }, variableObject: { arguments: { 0: ’有魚’, length: 1},name: ’有魚’, c: function c(),a: ’年年’, // 變量a進行賦值b: function b // 變量b進行賦值 }, this: { 3.創(chuàng)建this對象this:cat(’有魚’) name:’有魚’ // 對象屬性name進行賦值 }}

以上就是詳解JavaScript中的執(zhí)行上下文及調(diào)用堆棧的詳細(xì)內(nèi)容,更多關(guān)于JavaScript中的執(zhí)行上下文及調(diào)用堆棧的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | CXB船用变压器-JCZ系列制动器-HH101船用铜质开关-上海永上船舶电器厂 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 膏方加工_丸剂贴牌_膏滋代加工_湖北康瑞生物科技有限公司 | 智能风向风速仪,风速告警仪,数字温湿仪,综合气象仪(气象五要素)-上海风云气象仪器有限公司 | 曙光腾达官网-天津脚手架租赁-木板架出租-移动门式脚手架租赁「免费搭设」 | 美国HASKEL增压泵-伊莱科elettrotec流量开关-上海方未机械设备有限公司 | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 软膜天花_软膜灯箱_首选乐创品牌_一站式天花软膜材料供应商! | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 温州富欧金属封头-不锈钢封头厂家 | 合肥地磅_合肥数控切割机_安徽地磅厂家_合肥世佳电工设备有限公司 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 创富网-B2B网站|供求信息网|b2b平台|专业电子商务网站 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | 常州翔天实验仪器厂-恒温振荡器-台式恒温振荡器-微量血液离心机 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 有福网(yofus.com)洗照片冲印,毕业聚会纪念册相册制作个性DIY平台 | 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 气弹簧定制-气动杆-可控气弹簧-不锈钢阻尼器-工业气弹簧-可调节气弹簧厂家-常州巨腾气弹簧供应商 | 首页-瓜尔胶系列-化工单体系列-油田压裂助剂-瓜尔胶厂家-山东广浦生物科技有限公司 | 小型气象站_车载气象站_便携气象站-山东风途物联网 | 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | 高空重型升降平台_高空液压举升平台_高空作业平台_移动式升降机-河南华鹰机械设备有限公司 | 河南mpp电力管_mpp电力管生产厂家_mpp电力电缆保护管价格 - 河南晨翀实业 | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | 下水道疏通_管道疏通_马桶疏通_附近疏通电话- 立刻通 | 昆明化妆培训-纹绣美甲-美容美牙培训-昆明博澜培训学校 | 智慧养老_居家养老_社区养老_杰佳通 | 深圳市宏康仪器科技有限公司-模拟高空低压试验箱-高温防爆试验箱-温控短路试验箱【官网】 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 集装箱标准养护室-集装箱移动式养护室-广州璟业试验仪器有限公司 | EFM 022静电场测试仪-套帽式风量计-静电平板监测器-上海民仪电子有限公司 | J.S.Bach 圣巴赫_高端背景音乐系统_官网 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 山东聚盛新型材料有限公司-纳米防腐隔热彩铝板和纳米防腐隔热板以及钛锡板、PVDF氟膜板供应商 | 400电话_400电话申请_866元/年_【400电话官方业务办理】-俏号网 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 紧急切断阀_气动切断阀_不锈钢阀门_截止阀_球阀_蝶阀_闸阀-上海上兆阀门制造有限公司 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 |