亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

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

javascript執(zhí)行上下文、變量對象實(shí)例分析

瀏覽:2日期:2023-11-02 08:03:18

本文實(shí)例講述了javascript執(zhí)行上下文、變量對象。分享給大家供大家參考,具體如下:

突然看到一篇遠(yuǎn)在2010年的老文,作者以章節(jié)的形式向我們介紹了ECMA-262-3的部分內(nèi)容,主要涉及到執(zhí)行上下文、變量對象、作用域、this等語言細(xì)節(jié)。內(nèi)容短小而精悍,文風(fēng)直白而嚴(yán)謹(jǐn),讀完有酣暢淋漓、醍醐灌頂之感,強(qiáng)烈推薦?。。?/p>

原文鏈接:這里

本想翻譯成文,原來早已有人做了,這里。真生不逢時(shí),何其遺憾??!

做個(gè)筆記,聊慰我心。執(zhí)行上下文 ExecutionContext

每當(dāng)控制器(control)轉(zhuǎn)換到ECMAScript可執(zhí)行代碼時(shí),都會創(chuàng)建并進(jìn)入到一個(gè)可執(zhí)行上下文。

一段簡短的句子,卻包含著豐富的內(nèi)容:

控制器:即js引擎 轉(zhuǎn)換:從一段可執(zhí)行代碼跳轉(zhuǎn)到另一段可執(zhí)行代碼 可執(zhí)行代碼:全局代碼、函數(shù)代碼、eval代碼(分別對應(yīng)三種作用域) 執(zhí)行上下文:是一個(gè)抽象的概念,ECMA-262標(biāo)準(zhǔn)用這個(gè)概念同可執(zhí)行代碼(executable code)概念進(jìn)行區(qū)分

執(zhí)行上下文在邏輯上組成一個(gè)堆棧。堆棧底部永遠(yuǎn)都是全局上下文(global context),堆棧頂部是當(dāng)前/活動的執(zhí)行上下文(activeExecutionContext)。堆棧在EC類型的變量(various kingds of EC)被推入或彈出的同時(shí)被修改。

例如,我們可以定義一個(gè)數(shù)組來模擬執(zhí)行上下文堆棧:

ECStack = [ globalContext, <foo> functionContext]變量對象 VariableObject

變量對象(VO)作為執(zhí)行上下文的一個(gè)屬性存在,它存儲下列內(nèi)容:

所有變量聲明 (var, VariableDeclaration) VO的一個(gè)屬性,這個(gè)屬性由變量名稱和undefined值組成;如果變量名稱跟已經(jīng)聲明的形式參數(shù)或函數(shù)相同,則變量聲明不會干擾已經(jīng)存在的這類屬性。 函數(shù)聲明 (FunctionDeclaration, 縮寫為FD) VO的一個(gè)屬性,這個(gè)屬性由一個(gè)函數(shù)對象(function-object)的名稱和值組成;如果變量對象已經(jīng)存在相同名稱的屬性,則完全替換這個(gè)屬性。 以及函數(shù)的形參 VO的一個(gè)屬性,這個(gè)屬性由一個(gè)形式參數(shù)的名稱和值組成;如果沒有對應(yīng)傳遞實(shí)際參數(shù),那么這個(gè)屬性就由形式參數(shù)的名稱和undefined值組成;

VO = { // context data (var, FD, function arguments) }

當(dāng)我們聲明一個(gè)變量或一個(gè)函數(shù)的時(shí)候,同時(shí)還用變量的名稱和值在VO里創(chuàng)建了一個(gè)新的屬性。例如:

var m = 30;function test(a,b) { var c = 20 function d() {} var e = function _e() {};}test(10)

當(dāng)進(jìn)入“test”函數(shù)的上下文時(shí)(傳遞參數(shù)10),AO如下:

AO(test) = { a: 10, b: undefined, c: undefined, d: <reference to FunctionDeclaration 'd'> e: undefined};

test執(zhí)行到最后時(shí),對應(yīng)此刻上下文堆棧:

ECStack = [ globalContext: { VO: { m: 30, test: } }, test functionContext: { VO: { a: 10, b: undefined, c: 20, d: <reference to FunctionDeclaration 'd'>, e: <reference to FunctionDeclaration '_e'> } }]關(guān)于變量

通常,各類文章和JavaScript相關(guān)的書籍都聲稱:“不管是使用var關(guān)鍵字(在全局上下文)還是不使用var關(guān)鍵字(在任何地方),都可以聲明一個(gè)變量”。請記住,這絕對是謠傳:任何時(shí)候,變量只能通過使用var關(guān)鍵字才能聲明。

讓我們通過下面的實(shí)例看看具體的區(qū)別吧:

alert(a); // undefinedalert(b); // 'b' is not defined b = 10;var a = 20;

所有根源仍然是VO和它的修改階段(進(jìn)入上下文階段和執(zhí)行代碼階段):

VO = { a: undefined};

我們可以看到,因?yàn)椤癰”不是一個(gè)變量,所以在這個(gè)階段根本就沒有“b”,“b”將只在執(zhí)行代碼階段才會出現(xiàn)(但是在我們這個(gè)例子里,還沒有到那就已經(jīng)出錯了)。

讓我們改變一下例子代碼:

alert(a); // undefined, we know why b = 10;alert(b); // 10, created at code execution var a = 20;alert(a); // 20, modified at code execution

關(guān)于變量,還有一個(gè)重要的知識點(diǎn)。變量相對于簡單屬性來說,變量有一個(gè)特性(attribute):{DontDelete},這個(gè)特性的含義就是不同通過delete操作符直接刪除變量屬性。

a = 10;alert(window.a); // 10 alert(delete a); // true alert(window.a); // undefined var b = 20;alert(window.b); // 20 alert(delete b); // false alert(window.b); // still 20

2018-8-2-再看執(zhí)行上下文、變量對象

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運(yùn)行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》

希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 手机看片神马午夜片 | 毛片免费在线观看网址 | 成人精品一区久久久久 | 人成在线免费视频 | 深夜福利视频网站 | 亚洲国产精品一区二区三区在线观看 | 在线免费看一级片 | 国产日韩欧美在线一二三四 | 成人黄激情免费视频 | 亚洲精品国产啊女成拍色拍 | 午夜一级毛片看看 | 成年美女黄网站色大 | 在线观看亚洲国产 | 亚洲精品国产第一区二区三区 | 欧美色xxxx| 日日爱影院 | 亚洲综合成人在线 | 国产成人精品久久二区二区 | 欧美成人免费高清网站 | 97超级碰碰碰免费公开在线观看 | 亚洲综合色dddd26 | 大伊香蕉精品视频在线天堂 | 香蕉视频在线观看黄 | 日韩精品视频美在线精品视频 | 欧美jizzhd精品欧美另类 | 男人把女人桶到喷白浆的视频 | 日韩一级大片 | 久久99亚洲网美利坚合众国 | 日本乱理伦中文三区 | 日本加勒比网站 | 性欧美一级毛片欧美片 | 欧美激情视频一级视频一级毛片 | 国产91网| 9久久99久久久精品齐齐综合色圆 | 午夜一级毛片免费视频 | 国产精品成人aaaaa网站 | 欧美在线国产 | 国产在线综合视频 | 欧美亚洲国产精品久久高清 | 九九精品免费 | 亚洲视频黄 |