摘要:當(dāng)代碼運(yùn)行前,在全局執(zhí)行上下文中瀏覽器中就會默認(rèn)添加一些變量,如,所以在調(diào)用代碼時(shí)三函數(shù)中的激活對象與變量對象一樣,即只不過多了一個(gè)變量,為這個(gè)可選擇性忽略,沒什么用函數(shù)調(diào)用中的執(zhí)行上下文代碼如下
概念 一、執(zhí)行上下文: (Execution Context,縮寫 EC)
console.log("EC0"); function funcEC1(){ console.log("EC1"); function funcEC2(){ console.log("EC2"); var funcEC3 = function(){ console.log("EC3"); }; } funcEC2(); } funcEC1();
在Javascript引擎解析上述代碼時(shí)在執(zhí)行函數(shù)會依次將其添加到棧(Stack)中,即(ECO(Global),EC1,EC2),如下圖所示:
執(zhí)行上下文分為:全局執(zhí)行上下文和函數(shù)執(zhí)行上下文
二、變量對象:(Variable Object VO)是一個(gè)抽象的概念中的‘對象’,它用于存儲執(zhí)行上下文中的:
變量
函數(shù)聲明
函數(shù)參數(shù)
var a = 10; function test(x){ var b = 20; } test(30);
Javascript引擎會將其解析為:
VO(globalContext) = { a: 10, test: }; VO(test functionContext){ x:30, b:20 };
在瀏覽器中全局上下文變量對象為window,而在nodejs中全局上下文變量對象為global。
當(dāng)js代碼運(yùn)行前,在全局執(zhí)行上下文中(瀏覽器)中就會默認(rèn)添加一些變量,
如:Math,String,isNaN,window,所以在調(diào)用代碼時(shí):
String(10); //[[global]].String(10) window.a = 10; //[[global]].window.a = 10 this.b = 20; //[[global]].b = 20三、函數(shù)中的激活對象:(Active Object AO)
與變量對象一樣,即(VO(functionContext) === AO);
只不過AO多了一個(gè)變量,為arguments:
arguments = { callee, length, properties-indexes };
這個(gè)可選擇性忽略,沒什么用.
函數(shù)調(diào)用中的執(zhí)行上下文代碼如下:
function test(a, b){ var c = 10; function d(){} var e = function _e(){}; (function(){})(); b = 20; } test(10);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/79685.html
摘要:什么是中的調(diào)用棧調(diào)用棧就像是程序當(dāng)前執(zhí)行的日志。當(dāng)函數(shù)執(zhí)行結(jié)束時(shí),將從調(diào)用棧中出去。了解全局和局部執(zhí)行上下文是掌握作用域和閉包的關(guān)鍵。總結(jié)引擎創(chuàng)建執(zhí)行上下文,全局存儲器和調(diào)用棧。 原文作者:Valentino 原文鏈接:https://www.valentinog.com/blog/js-execution-context-call-stack 什么是Javascript中的執(zhí)行上下文...
摘要:深入系列第七篇,結(jié)合之前所講的四篇文章,以權(quán)威指南的為例,具體講解當(dāng)函數(shù)執(zhí)行的時(shí)候,執(zhí)行上下文棧變量對象作用域鏈?zhǔn)侨绾巫兓摹G把栽谏钊胫畧?zhí)行上下文棧中講到,當(dāng)代碼執(zhí)行一段可執(zhí)行代碼時(shí),會創(chuàng)建對應(yīng)的執(zhí)行上下文。 JavaScript深入系列第七篇,結(jié)合之前所講的四篇文章,以權(quán)威指南的demo為例,具體講解當(dāng)函數(shù)執(zhí)行的時(shí)候,執(zhí)行上下文棧、變量對象、作用域鏈?zhǔn)侨绾巫兓摹?前言 在《Jav...
摘要:深入系列第三篇,講解執(zhí)行上下文棧的是如何執(zhí)行的,也回答了第二篇中的略難的思考題。 JavaScript深入系列第三篇,講解執(zhí)行上下文棧的是如何執(zhí)行的,也回答了第二篇中的略難的思考題。 順序執(zhí)行? 如果要問到 JavaScript 代碼執(zhí)行順序的話,想必寫過 JavaScript 的開發(fā)者都會有個(gè)直觀的印象,那就是順序執(zhí)行,畢竟: var foo = function () { ...
摘要:執(zhí)行上下文當(dāng)代碼運(yùn)行的時(shí)候,運(yùn)行代碼的環(huán)境形成了執(zhí)行上下文,執(zhí)行上下文決定代碼可以訪問哪些變量函數(shù)對象等。我們將執(zhí)行上下文簡單視為運(yùn)行當(dāng)前代碼的,我們知道作用域分為和。完成后,其執(zhí)行堆棧將從堆棧中刪除,將控制權(quán)交給全局執(zhí)行上下文。 我們通常將 JavaScript 歸類為動態(tài)或解釋執(zhí)行語言,但實(shí)際上它也是一門編譯語言,它有自己的編譯器形式,運(yùn)行在 JavaScript 引擎中。 每個(gè) ...
摘要:深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。定義對閉包的定義為閉包是指那些能夠訪問自由變量的函數(shù)。 JavaScript深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。 定義 MDN 對閉包的定義為: 閉包是指那些能夠訪問自由變量的函數(shù)。 那什么是自由變量呢? 自由變量是指在函數(shù)中使用的,但既不是函數(shù)參數(shù)也...
摘要:執(zhí)行上下文和執(zhí)行棧是中關(guān)鍵概念之一,是難點(diǎn)之一。理解執(zhí)行上下文和執(zhí)行棧同樣有助于理解其他的概念如提升機(jī)制作用域和閉包等。函數(shù)執(zhí)行完成,函數(shù)的執(zhí)行上下文出棧,并且被銷毀。 前言 如果你是一名 JavaScript 開發(fā)者,或者想要成為一名 JavaScript 開發(fā)者,那么你必須知道 JavaScript 程序內(nèi)部的執(zhí)行機(jī)制。執(zhí)行上下文和執(zhí)行棧是JavaScript中關(guān)鍵概念之一,是Ja...
閱讀 3205·2021-11-17 09:33
閱讀 3288·2021-11-15 11:37
閱讀 2950·2021-10-19 11:47
閱讀 3199·2019-08-29 15:32
閱讀 1002·2019-08-29 15:27
閱讀 1526·2019-08-29 13:15
閱讀 932·2019-08-29 12:47
閱讀 2023·2019-08-29 11:30