摘要:執(zhí)行上下文環(huán)境然后將執(zhí)行上下文環(huán)境壓棧,設(shè)置為活動狀態(tài)當(dāng)前唯一然后執(zhí)行到第行,調(diào)用函數(shù)。有閉包存在時,一個作用域存在兩個上下文環(huán)境也是有的。這就是作用域鏈。
執(zhí)行上下文本文參考引自:深入理解javascript原型和閉包(完結(jié))
不得不說,這個系列文章是真的給人恍然頓悟的感覺,寫的非常好,強烈推薦。感謝大佬!
函數(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
摘要:講作用域鏈?zhǔn)紫纫獜淖饔糜蛑v起,下面是百度百科里對作用域的定義作用域在許多程序設(shè)計語言中非常重要。原文出處談?wù)務(wù)Z法里一些難點問題二 3) 作用域鏈相關(guān)的問題 作用域鏈?zhǔn)莏avascript語言里非常紅的概念,很多學(xué)習(xí)和使用javascript語言的程序員都知道作用域鏈?zhǔn)抢斫鈐avascript里很重要的一些概念的關(guān)鍵,這些概念包括this指針,閉包等等,它非常紅的另一個重要原因就...
摘要:以上描述,全部符合閉包的描述,那這就是閉包。二執(zhí)行過程之前的文章講了函數(shù)的執(zhí)行上下文棧,變量對象,作用域鏈等內(nèi)容,接下來通過閉包代碼回顧代碼是怎么樣的執(zhí)行過程。將活動對象壓入作用域鏈頂端。函數(shù)執(zhí)行結(jié)束,彈出執(zhí)行上下文棧。 本文一共 1300 字,讀完只需 5 分鐘 概述 閉包, 可以說是每個前端工程師都聽說的一個詞,咋一看很難從字面上去理解,從而給人留下了閉包是一個重要又難以理解的...
前言 JavaScript中有一個被稱為作用域(Scope)的特性。雖然對于許多新手開發(fā)者來說,作用域的概念并不是很容易理解,本文我會盡我所能用最簡單的方式來解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運行時代碼中的某些特定部分中變量,函數(shù)和對象的可訪問性。換句話說,作用域決定了代碼區(qū)塊中變量和其他資源的可見...
前言 JavaScript中有一個被稱為作用域(Scope)的特性。雖然對于許多新手開發(fā)者來說,作用域的概念并不是很容易理解,本文我會盡我所能用最簡單的方式來解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運行時代碼中的某些特定部分中變量,函數(shù)和對象的可訪問性。換句話說,作用域決定了代碼區(qū)塊中變量和其他資源的可見...
摘要:執(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)一段代碼進行運行的時候...
閱讀 1045·2021-11-15 18:11
閱讀 3170·2021-09-22 15:33
閱讀 3465·2021-09-01 11:42
閱讀 2660·2021-08-24 10:03
閱讀 3625·2021-07-29 13:50
閱讀 2930·2019-08-30 14:08
閱讀 1279·2019-08-28 17:56
閱讀 2263·2019-08-26 13:57