国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

深入學習js之——執行上下文

baukh789 / 875人閱讀

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

在《深入學習js之——執行上下文棧》中說過,當JavaScript代碼執行一段可執行代碼(executable code)時,會創建對應的執行上下文(execution context)

對于每一個執行上下文,都有三個重要的屬性:

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

本文我們結合著這三個部分的內容,講講執行上下文的具體處理過程。

思考題

在《深入學習js之——詞法作用域和動態作用域》中,提出這樣一道思考題:

// 思考題一:
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()();

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

具體分析

我們分析第一段代碼:

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

執行過程如下:

1、執行全局代碼,創建全局執行上下文,全局上下文被壓入執行上下文棧

ECStack = [
  globalContext
];

2、全局上下文初始化

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

2、初始化的同時,checkscope 函數被創建,保存作用域鏈到函數內部的屬性[[scope]]

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

3、執行checkScope 函數,創建checkScope 函數執行上下文,checkScope 函數執行上下文被壓入執行上下文棧:

ECStack = [
  checkscopeContext,
  globalContext
];

4、checkscope 函數執行上下文初始化:

1.復制函數 [[scope]] 屬性創建作用域鏈,
2.用 arguments 創建活動對象,
3.初始化活動對象,即加入形參、函數聲明、變量聲明,
4.將活動對象壓入 checkscope 作用域鏈頂端,

同時 f 函數被創建,保存作用域鏈到 f 函數的內部屬性[[scope]]

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

5、執行f函數,創建 f 函數執行上下文,f 函數執行上下文被壓入執行上下文棧

  ECStack = [
    fContext,
    checkscopeContext,
    globalContext
  ]

6、f 函數執行上下文初始化, 以下跟第 4 步相同:

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

7、f 函數執行,沿著作用域鏈查找 scope 值,返回 scope 值

8、f 函數執行完畢,f 函數上下文從執行上下文棧中彈出

ECStack = [
  checkscopeContext,
  globalContext
]

9、checkscope 函數執行完畢,checkscope 執行上下文從執行上下文棧中彈出

ECStack = [
  globalContext
]

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102558.html

相關文章

  • 深入學習js——作用域鏈

    摘要:開篇作用域是每種計算機語言最重要的基礎之一,因此要想深入的學習作用域和作用域鏈就是個繞不開的話題。這樣由多個執行上下文的變量對象構成的鏈表就叫做作用域鏈。這時候執行上下文的作用域鏈,我們命名為至此,作用域鏈創建完畢。 開篇 作用域是每種計算機語言最重要的基礎之一,因此要想深入的學習JavaScript,作用域和作用域鏈就是個繞不開的話題。 在《深入學習js之—-執行上下文棧》中我們提到...

    lemanli 評論0 收藏0
  • 深入學習js——執行下文

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

    Lucky_Boy 評論0 收藏0
  • JavaScript深入系列15篇正式完結!

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

    fxp 評論0 收藏0
  • 深入學習js——詞法作用域和動態作用域

    摘要:在中的應用采用詞法作用域,也就是靜態作用域。那什么又是詞法作用域或者靜態作用域呢請繼續往下看靜態作用域與動態作用域因為采用的是詞法作用域函數的作用域在函數定義的時候就決定了。 開篇 當我們在開始學習任何一門語言的時候,都會接觸到變量的概念,變量的出現其實是為了解決一個問題,為的是存儲某些值,進而,存儲某些值的目的是為了在之后對這個值進行訪問或者修改,正是這種存儲和訪問變量的能力將狀態給...

    shiweifu 評論0 收藏0
  • javascript知識點

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

    Karrdy 評論0 收藏0

發表評論

0條評論

baukh789

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<