亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

深入學(xué)習(xí)js之——執(zhí)行上下文

baukh789 / 935人閱讀

摘要:思考題在深入學(xué)習(xí)之詞法作用域和動(dòng)態(tài)作用域中,提出這樣一道思考題思考題一思考題二兩段代碼都會(huì)打印但是還是有些許差異的,本文就詳細(xì)的解析執(zhí)行上下文棧和執(zhí)行上下文的具體變化過程。

在《深入學(xué)習(xí)js之——執(zhí)行上下文?!分姓f過,當(dāng)JavaScript代碼執(zhí)行一段可執(zhí)行代碼(executable code)時(shí),會(huì)創(chuàng)建對(duì)應(yīng)的執(zhí)行上下文(execution context)

對(duì)于每一個(gè)執(zhí)行上下文,都有三個(gè)重要的屬性:

變量對(duì)象(Variable object VO)
作用域鏈(Scope chain)
this

本文我們結(jié)合著這三個(gè)部分的內(nèi)容,講講執(zhí)行上下文的具體處理過程。

思考題

在《深入學(xué)習(xí)js之——詞法作用域和動(dòng)態(tài)作用域》中,提出這樣一道思考題:

// 思考題一:
var scope = "global scope";
function checkscope(){
  var scope = "local scope";
  function f(){
    return scope;
  }
  return f();
}
checkscope();

// 思考題二:
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope()();

兩段代碼都會(huì)打印local scope,但是還是有些許差異的,本文就詳細(xì)的解析執(zhí)行上下文棧執(zhí)行上下文的具體變化過程。

具體分析

我們分析第一段代碼:

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();

執(zhí)行過程如下:

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

ECStack = [
  globalContext
];

2、全局上下文初始化

globalContext = {
  VO: [global],
  Scope: [globalContext.VO],
  this: globalContext.VO
}

2、初始化的同時(shí),checkscope 函數(shù)被創(chuàng)建,保存作用域鏈到函數(shù)內(nèi)部的屬性[[scope]]

checkscope.[[scope]] = [
  globalContext.VO
];

3、執(zhí)行checkScope 函數(shù),創(chuàng)建checkScope 函數(shù)執(zhí)行上下文,checkScope 函數(shù)執(zhí)行上下文被壓入執(zhí)行上下文棧:

ECStack = [
  checkscopeContext,
  globalContext
];

4、checkscope 函數(shù)執(zhí)行上下文初始化:

1.復(fù)制函數(shù) [[scope]] 屬性創(chuàng)建作用域鏈,
2.用 arguments 創(chuàng)建活動(dòng)對(duì)象,
3.初始化活動(dòng)對(duì)象,即加入形參、函數(shù)聲明、變量聲明,
4.將活動(dòng)對(duì)象壓入 checkscope 作用域鏈頂端,

同時(shí) f 函數(shù)被創(chuàng)建,保存作用域鏈到 f 函數(shù)的內(nèi)部屬性[[scope]]

checkscopeContext = {
  AO: {
      arguments: {
        length: 0
      },
      scope: undefined,
      f: reference to function f(){}
  },
  Scope: [AO, globalContext.VO],
  this: undefined
}

5、執(zhí)行f函數(shù),創(chuàng)建 f 函數(shù)執(zhí)行上下文,f 函數(shù)執(zhí)行上下文被壓入執(zhí)行上下文棧

  ECStack = [
    fContext,
    checkscopeContext,
    globalContext
  ]

6、f 函數(shù)執(zhí)行上下文初始化, 以下跟第 4 步相同:

1.復(fù)制函數(shù) [[scope]] 屬性創(chuàng)建作用域鏈
2.用 arguments 創(chuàng)建活動(dòng)對(duì)象
3.初始化活動(dòng)對(duì)象,即加入形參、函數(shù)聲明、變量聲明
4.將活動(dòng)對(duì)象壓入 f 作用域鏈頂端
  fContext = {
    AO: {
        arguments: {
            length: 0
        }
    },
    Scope: [AO, checkscopeContext.AO, globalContext.VO],
    this: undefined
  }

7、f 函數(shù)執(zhí)行,沿著作用域鏈查找 scope 值,返回 scope 值

8、f 函數(shù)執(zhí)行完畢,f 函數(shù)上下文從執(zhí)行上下文棧中彈出

ECStack = [
  checkscopeContext,
  globalContext
]

9、checkscope 函數(shù)執(zhí)行完畢,checkscope 執(zhí)行上下文從執(zhí)行上下文棧中彈出

ECStack = [
  globalContext
]

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/102558.html

相關(guān)文章

  • 深入學(xué)習(xí)js——作用域鏈

    摘要:開篇作用域是每種計(jì)算機(jī)語言最重要的基礎(chǔ)之一,因此要想深入的學(xué)習(xí)作用域和作用域鏈就是個(gè)繞不開的話題。這樣由多個(gè)執(zhí)行上下文的變量對(duì)象構(gòu)成的鏈表就叫做作用域鏈。這時(shí)候執(zhí)行上下文的作用域鏈,我們命名為至此,作用域鏈創(chuàng)建完畢。 開篇 作用域是每種計(jì)算機(jī)語言最重要的基礎(chǔ)之一,因此要想深入的學(xué)習(xí)JavaScript,作用域和作用域鏈就是個(gè)繞不開的話題。 在《深入學(xué)習(xí)js之—-執(zhí)行上下文?!分形覀兲岬?..

    lemanli 評(píng)論0 收藏0
  • 深入學(xué)習(xí)js——執(zhí)行下文

    摘要:當(dāng)遇到函數(shù)調(diào)用時(shí),引擎為該函數(shù)創(chuàng)建一個(gè)新的執(zhí)行上下文并把它壓入當(dāng)前執(zhí)行棧的頂部。參考鏈接理解中的執(zhí)行上下文和執(zhí)行棧深入之執(zhí)行上下文棧 開篇 作為一個(gè)JavaScript的程序開發(fā)者,如果被問到JavaScript代碼的執(zhí)行順序,你腦海中是不是有一個(gè)直觀的印象 -- JavaScript 是順序執(zhí)行的,可事實(shí)真的是這樣的嗎? 讓我們首先看兩個(gè)小例子: var foo = functio...

    Lucky_Boy 評(píng)論0 收藏0
  • JavaScript深入系列15篇正式完結(jié)!

    摘要:寫在前面深入系列共計(jì)篇已經(jīng)正式完結(jié),這是一個(gè)旨在幫助大家,其實(shí)也是幫助自己捋順底層知識(shí)的系列。深入系列自月日發(fā)布第一篇文章,到月日發(fā)布最后一篇,感謝各位朋友的收藏點(diǎn)贊,鼓勵(lì)指正。 寫在前面 JavaScript 深入系列共計(jì) 15 篇已經(jīng)正式完結(jié),這是一個(gè)旨在幫助大家,其實(shí)也是幫助自己捋順 JavaScript 底層知識(shí)的系列。重點(diǎn)講解了如原型、作用域、執(zhí)行上下文、變量對(duì)象、this、...

    fxp 評(píng)論0 收藏0
  • 深入學(xué)習(xí)js——詞法作用域和動(dòng)態(tài)作用域

    摘要:在中的應(yīng)用采用詞法作用域,也就是靜態(tài)作用域。那什么又是詞法作用域或者靜態(tài)作用域呢請(qǐng)繼續(xù)往下看靜態(tài)作用域與動(dòng)態(tài)作用域因?yàn)椴捎玫氖窃~法作用域函數(shù)的作用域在函數(shù)定義的時(shí)候就決定了。 開篇 當(dāng)我們?cè)陂_始學(xué)習(xí)任何一門語言的時(shí)候,都會(huì)接觸到變量的概念,變量的出現(xiàn)其實(shí)是為了解決一個(gè)問題,為的是存儲(chǔ)某些值,進(jìn)而,存儲(chǔ)某些值的目的是為了在之后對(duì)這個(gè)值進(jìn)行訪問或者修改,正是這種存儲(chǔ)和訪問變量的能力將狀態(tài)給...

    shiweifu 評(píng)論0 收藏0
  • javascript知識(shí)點(diǎn)

    摘要:模塊化是隨著前端技術(shù)的發(fā)展,前端代碼爆炸式增長后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調(diào)也不等同于異步。將會(huì)討論安全的類型檢測(cè)惰性載入函數(shù)凍結(jié)對(duì)象定時(shí)器等話題。 Vue.js 前后端同構(gòu)方案之準(zhǔn)備篇——代碼優(yōu)化 目前 Vue.js 的火爆不亞于當(dāng)初的 React,本人對(duì)寫代碼有潔癖,代碼也是藝術(shù)。此篇是準(zhǔn)備篇,工欲善其事,必先利其器。我們先在代...

    Karrdy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

baukh789

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<