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

資訊專欄INFORMATION COLUMN

執(zhí)行上下文和作用域的理解

wenyiweb / 491人閱讀

摘要:執(zhí)行上下文環(huán)境然后將執(zhí)行上下文環(huán)境壓棧,設(shè)置為活動狀態(tài)當(dāng)前唯一然后執(zhí)行到第行,調(diào)用函數(shù)。有閉包存在時,一個作用域存在兩個上下文環(huán)境也是有的。這就是作用域鏈。

本文參考引自:深入理解javascript原型和閉包(完結(jié))
不得不說,這個系列文章是真的給人恍然頓悟的感覺,寫的非常好,強烈推薦。感謝大佬!

執(zhí)行上下文

函數(shù)每調(diào)用一次,都會產(chǎn)生一個新的執(zhí)行上下文環(huán)境。因為不同的調(diào)用可能就有不同的參數(shù)。

function fn(x) {
  console.log(arguments)
  console.log(x)
}
fn(20)
fn(10) // 不同的調(diào)用可能有不同的參數(shù)
執(zhí)行上下文棧

執(zhí)行全局代碼時,會產(chǎn)生一個執(zhí)行上下文環(huán)境,每次調(diào)用函數(shù)都又會執(zhí)行上下文環(huán)境。當(dāng)函數(shù)調(diào)用完成時,這個上下文環(huán)境以及其中的數(shù)據(jù)都會被消除(當(dāng)然了閉包并不會乖乖就范),處于活動狀態(tài)的執(zhí)行上下文環(huán)境只有一個

// 這是一個壓棧出棧的過程--執(zhí)行上下文棧
1 let a = 10, fn, // 1、進入全局上下文環(huán)境
2    bar = function(x) {
3      let b = 5
4      fn(x + b) // 3、進入fn函數(shù)上下文環(huán)境
5    }
6 fn = function(y) {
7  let c = 5
8  console.log(y + c)
9 }
10
11 bar(10) // 2、進入bar函數(shù)上下文環(huán)境

(1)執(zhí)行代碼之前,首先創(chuàng)建全局上下文環(huán)境。(活動狀態(tài))

// 全局上下文環(huán)境
a: undefined
fn: undefined
bar: undefined
this: window

然后執(zhí)行代碼,代碼到10行之前,上下文環(huán)境中的變量都在執(zhí)行過程中被賦值。

// 全局上下文環(huán)境
a: 10
fn: function
bar: function
this: window

(2)然后執(zhí)行到11行,調(diào)用bar函數(shù)。
跳轉(zhuǎn)到bar函數(shù)內(nèi)部,執(zhí)行函數(shù)體語句之前,會創(chuàng)建一個新的執(zhí)行上下文環(huán)境。

// bar執(zhí)行上下文環(huán)境
b: undefined
x: 10
arguments: [10]
this: window

然后將bar執(zhí)行上下文環(huán)境壓棧,設(shè)置為活動狀態(tài)(當(dāng)前唯一)

(3)然后執(zhí)行到第4行,調(diào)用fn函數(shù)。
調(diào)到fn函數(shù)內(nèi)部,執(zhí)行函數(shù)體語句之前,會創(chuàng)建一個新的執(zhí)行上下文環(huán)境

// fn執(zhí)行上下文環(huán)境
c: undefined
y: 15
arguments: [15]
this: window

然后將fn執(zhí)行上下文環(huán)境壓棧,設(shè)置為活動狀態(tài)(當(dāng)前唯一)

(4)fn執(zhí)行完畢后,調(diào)用fn函數(shù)生成的fn上下文環(huán)境出棧,被銷毀。
然后bar執(zhí)行完畢后,調(diào)用bar函數(shù)生成的上下文環(huán)境出棧,被銷毀。然后剩下全局上下文環(huán)境,出棧銷毀。

作用域

JS沒有塊級作用域,除了全局作用域,函數(shù)會創(chuàng)建自己的作用域。作用域在函數(shù)定義時就已經(jīng)確定了,不是在函數(shù)調(diào)用確定(區(qū)別于執(zhí)行上下文環(huán)境,當(dāng)然this也是上下文環(huán)境里的成分)

// 全局作用域
let x = 100
    // fn作用域
    function fn(x) {
        // bar作用域
        function bar(x) {
          console.log(x)
        }
    }

let f1 = fn(5)
let f2 = fn(10)

f1() // 5
f2() // 10

作用域只是一個“地盤”,其中沒有變量。變量是通過作用域?qū)?yīng)的執(zhí)行上下文環(huán)境中的變量對象來實現(xiàn)的。所以作用域是靜態(tài)觀念的,而執(zhí)行上下文環(huán)境是動態(tài)上的,兩者并不一樣。有閉包存在時,一個作用域存在兩個上下文環(huán)境也是有的。

同一個作用域下,對同一個函數(shù)的不同的調(diào)用會產(chǎn)生不同的執(zhí)行上下文環(huán)境,繼而產(chǎn)生不同的變量的值,所以,作用域中變量的值是在執(zhí)行過程中確定的,而作用域是在函數(shù)創(chuàng)建時就確定的。

如果要查找一個作用域下某個變量的值,就需要找到這個作用域?qū)?yīng)的執(zhí)行上下文環(huán)境,再在其中找到變量的值。

作用域鏈

函數(shù)在定義的時候(不是調(diào)用的時候)就已經(jīng)確定了函數(shù)體內(nèi)部自由變量的作用域。

自由變量:比如a,是在fn作用域使用,但是并沒有在fn作用域定義,這就是自由變量。

let a = 100
function fn() {
  let b = 20
  function bar() {
    console.log(a + b) // a是自由變量
  }
  return bar
}

let x = fn(), b = 200
x()   

那么自由變量是如何得到的呢?這就引出了作用域鏈。

bar要取得a的值,就要到創(chuàng)建bar這個函數(shù)的作用域中取值(這里是fn作用域),fn作用域也沒有a,就到創(chuàng)建fn這個函數(shù)的作用域中取值(這里是全局作用域),找到了就結(jié)束了。這就是作用域鏈。

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/89490.html

相關(guān)文章

  • 談?wù)刯avascript語法里一些難點問題(二)

    摘要:講作用域鏈?zhǔn)紫纫獜淖饔糜蛑v起,下面是百度百科里對作用域的定義作用域在許多程序設(shè)計語言中非常重要。原文出處談?wù)務(wù)Z法里一些難點問題二 3) 作用域鏈相關(guān)的問題 作用域鏈?zhǔn)莏avascript語言里非常紅的概念,很多學(xué)習(xí)和使用javascript語言的程序員都知道作用域鏈?zhǔn)抢斫鈐avascript里很重要的一些概念的關(guān)鍵,這些概念包括this指針,閉包等等,它非常紅的另一個重要原因就...

    Enlightenment 評論0 收藏0
  • JavaScript之閉包

    摘要:以上描述,全部符合閉包的描述,那這就是閉包。二執(zhí)行過程之前的文章講了函數(shù)的執(zhí)行上下文棧,變量對象,作用域鏈等內(nèi)容,接下來通過閉包代碼回顧代碼是怎么樣的執(zhí)行過程。將活動對象壓入作用域鏈頂端。函數(shù)執(zhí)行結(jié)束,彈出執(zhí)行上下文棧。 本文一共 1300 字,讀完只需 5 分鐘 概述 閉包, 可以說是每個前端工程師都聽說的一個詞,咋一看很難從字面上去理解,從而給人留下了閉包是一個重要又難以理解的...

    huashiou 評論0 收藏0
  • 深入理解JavaScript作用作用域鏈

    前言 JavaScript中有一個被稱為作用域(Scope)的特性。雖然對于許多新手開發(fā)者來說,作用域的概念并不是很容易理解,本文我會盡我所能用最簡單的方式來解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運行時代碼中的某些特定部分中變量,函數(shù)和對象的可訪問性。換句話說,作用域決定了代碼區(qū)塊中變量和其他資源的可見...

    baiy 評論0 收藏0
  • 深入理解JavaScript作用作用域鏈

    前言 JavaScript中有一個被稱為作用域(Scope)的特性。雖然對于許多新手開發(fā)者來說,作用域的概念并不是很容易理解,本文我會盡我所能用最簡單的方式來解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運行時代碼中的某些特定部分中變量,函數(shù)和對象的可訪問性。換句話說,作用域決定了代碼區(qū)塊中變量和其他資源的可見...

    ytwman 評論0 收藏0
  • javascript的執(zhí)行環(huán)境作用域的理解1

    摘要:執(zhí)行環(huán)境又稱作執(zhí)行上下文,其作用就是規(guī)定了對環(huán)境內(nèi)的變量還有函數(shù)的操作權(quán)利,主要分為全局的執(zhí)行環(huán)境和局部的執(zhí)行環(huán)境。創(chuàng)建作用域鏈的作用主要是讓每個嵌套關(guān)聯(lián)的執(zhí)行環(huán)境中的變量和函數(shù)有序的調(diào)用和操作。 1 執(zhí)行環(huán)境(exeution context)又稱作執(zhí)行上下文,其作用就是規(guī)定了對環(huán)境內(nèi)的變量還有函數(shù)的操作權(quán)利,主要分為全局的執(zhí)行環(huán)境和局部的執(zhí)行環(huán)境。 2 當(dāng)一段代碼進行運行的時候...

    Raaabbit 評論0 收藏0

發(fā)表評論

0條評論

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