您好,登錄后才能下訂單哦!
這篇文章主要講解了javascript執(zhí)行上下文、變量對象的方法,內(nèi)容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
執(zhí)行上下文 ExecutionContext
每當控制器(control)轉(zhuǎn)換到ECMAScript
可執(zhí)行代碼時,都會創(chuàng)建并進入到一個可執(zhí)行上下文。
一段簡短的句子,卻包含著豐富的內(nèi)容:
js
引擎eval
代碼(分別對應三種作用域)執(zhí)行上下文在邏輯上組成一個堆棧。堆棧底部永遠都是全局上下文(global context),堆棧頂部是當前/活動的執(zhí)行上下文(activeExecutionContext)。堆棧在EC類型的變量(various kingds of EC)被推入或彈出的同時被修改。
例如,我們可以定義一個數(shù)組來模擬執(zhí)行上下文堆棧:
ECStack = [ globalContext, <foo> functionContext ]
變量對象(VO)作為執(zhí)行上下文的一個屬性存在,它存儲下列內(nèi)容:
VO = { // context data (var, FD, function arguments) }
當我們聲明一個變量或一個函數(shù)的時候,同時還用變量的名稱和值在VO里創(chuàng)建了一個新的屬性。
例如:
var m = 30; function test(a,b) { var c = 20 function d() {} var e = function _e() {}; } test(10)
當進入“test”函數(shù)的上下文時(傳遞參數(shù)10),AO如下:
AO(test) = { a: 10, b: undefined, c: undefined, d: <reference to FunctionDeclaration "d"> e: undefined };
test執(zhí)行到最后時,對應此刻上下文堆棧:
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"> } } ]
通常,各類文章和JavaScript相關(guān)的書籍都聲稱:“不管是使用var關(guān)鍵字(在全局上下文)還是不使用var關(guān)鍵字(在任何地方),都可以聲明一個變量”。請記住,這絕對是謠傳:任何時候,變量只能通過使用var關(guān)鍵字才能聲明。
讓我們通過下面的實例看看具體的區(qū)別吧:
alert(a); // undefined alert(b); // "b" is not defined b = 10; var a = 20;
所有根源仍然是VO和它的修改階段(進入上下文階段和執(zhí)行代碼階段):
VO = { a: undefined };
我們可以看到,因為“b”不是一個變量,所以在這個階段根本就沒有“b”,“b”將只在執(zhí)行代碼階段才會出現(xiàn)(但是在我們這個例子里,還沒有到那就已經(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)于變量,還有一個重要的知識點。變量相對于簡單屬性來說,變量有一個特性(attribute):{DontDelete},這個特性的含義就是不同通過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í)行上下文、變量對象
看完上述內(nèi)容,是不是對javascript執(zhí)行上下文、變量對象的方法有進一步的了解,如果還想學習更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。