摘要:執(zhí)行上下文環(huán)境然后將執(zhí)行上下文環(huán)境壓棧,設(shè)置為活動(dòng)狀態(tài)當(dāng)前唯一然后執(zhí)行到第行,調(diào)用函數(shù)。有閉包存在時(shí),一個(gè)作用域存在兩個(gè)上下文環(huán)境也是有的。這就是作用域鏈。
執(zhí)行上下文本文參考引自:深入理解javascript原型和閉包(完結(jié))
不得不說(shuō),這個(gè)系列文章是真的給人恍然頓悟的感覺(jué),寫(xiě)的非常好,強(qiáng)烈推薦。感謝大佬!
函數(shù)每調(diào)用一次,都會(huì)產(chǎn)生一個(gè)新的執(zhí)行上下文環(huán)境。因?yàn)椴煌恼{(diào)用可能就有不同的參數(shù)。
function fn(x) { console.log(arguments) console.log(x) } fn(20) fn(10) // 不同的調(diào)用可能有不同的參數(shù)執(zhí)行上下文棧
執(zhí)行全局代碼時(shí),會(huì)產(chǎn)生一個(gè)執(zhí)行上下文環(huán)境,每次調(diào)用函數(shù)都又會(huì)執(zhí)行上下文環(huán)境。當(dāng)函數(shù)調(diào)用完成時(shí),這個(gè)上下文環(huán)境以及其中的數(shù)據(jù)都會(huì)被消除(當(dāng)然了閉包并不會(huì)乖乖就范),處于活動(dòng)狀態(tài)的執(zhí)行上下文環(huán)境只有一個(gè)。
// 這是一個(gè)壓棧出棧的過(guò)程--執(zhí)行上下文棧 1 let a = 10, fn, // 1、進(jìn)入全局上下文環(huán)境 2 bar = function(x) { 3 let b = 5 4 fn(x + b) // 3、進(jìn)入fn函數(shù)上下文環(huán)境 5 } 6 fn = function(y) { 7 let c = 5 8 console.log(y + c) 9 } 10 11 bar(10) // 2、進(jìn)入bar函數(shù)上下文環(huán)境
(1)執(zhí)行代碼之前,首先創(chuàng)建全局上下文環(huán)境。(活動(dòng)狀態(tài))
// 全局上下文環(huán)境 a: undefined fn: undefined bar: undefined this: window
然后執(zhí)行代碼,代碼到10行之前,上下文環(huán)境中的變量都在執(zhí)行過(guò)程中被賦值。
// 全局上下文環(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ù)體語(yǔ)句之前,會(huì)創(chuàng)建一個(gè)新的執(zhí)行上下文環(huán)境。
// bar執(zhí)行上下文環(huán)境 b: undefined x: 10 arguments: [10] this: window
然后將bar執(zhí)行上下文環(huán)境壓棧,設(shè)置為活動(dòng)狀態(tài)(當(dāng)前唯一)
(3)然后執(zhí)行到第4行,調(diào)用fn函數(shù)。
調(diào)到fn函數(shù)內(nèi)部,執(zhí)行函數(shù)體語(yǔ)句之前,會(huì)創(chuàng)建一個(gè)新的執(zhí)行上下文環(huán)境
// fn執(zhí)行上下文環(huán)境 c: undefined y: 15 arguments: [15] this: window
然后將fn執(zhí)行上下文環(huán)境壓棧,設(shè)置為活動(dòng)狀態(tài)(當(dāng)前唯一)
(4)fn執(zhí)行完畢后,調(diào)用fn函數(shù)生成的fn上下文環(huán)境出棧,被銷(xiāo)毀。
然后bar執(zhí)行完畢后,調(diào)用bar函數(shù)生成的上下文環(huán)境出棧,被銷(xiāo)毀。然后剩下全局上下文環(huán)境,出棧銷(xiāo)毀。
JS沒(méi)有塊級(jí)作用域,除了全局作用域,函數(shù)會(huì)創(chuàng)建自己的作用域。作用域在函數(shù)定義時(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
作用域只是一個(gè)“地盤(pán)”,其中沒(méi)有變量。變量是通過(guò)作用域?qū)?yīng)的執(zhí)行上下文環(huán)境中的變量對(duì)象來(lái)實(shí)現(xiàn)的。所以作用域是靜態(tài)觀念的,而執(zhí)行上下文環(huán)境是動(dòng)態(tài)上的,兩者并不一樣。有閉包存在時(shí),一個(gè)作用域存在兩個(gè)上下文環(huán)境也是有的。
同一個(gè)作用域下,對(duì)同一個(gè)函數(shù)的不同的調(diào)用會(huì)產(chǎn)生不同的執(zhí)行上下文環(huán)境,繼而產(chǎn)生不同的變量的值,所以,作用域中變量的值是在執(zhí)行過(guò)程中確定的,而作用域是在函數(shù)創(chuàng)建時(shí)就確定的。
如果要查找一個(gè)作用域下某個(gè)變量的值,就需要找到這個(gè)作用域?qū)?yīng)的執(zhí)行上下文環(huán)境,再在其中找到變量的值。
作用域鏈函數(shù)在定義的時(shí)候(不是調(diào)用的時(shí)候)就已經(jīng)確定了函數(shù)體內(nèi)部自由變量的作用域。
自由變量:比如a,是在fn作用域使用,但是并沒(méi)有在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這個(gè)函數(shù)的作用域中取值(這里是fn作用域),fn作用域也沒(méi)有a,就到創(chuàng)建fn這個(gè)函數(shù)的作用域中取值(這里是全局作用域),找到了就結(jié)束了。這就是作用域鏈。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89490.html
摘要:講作用域鏈?zhǔn)紫纫獜淖饔糜蛑v起,下面是百度百科里對(duì)作用域的定義作用域在許多程序設(shè)計(jì)語(yǔ)言中非常重要。原文出處談?wù)務(wù)Z法里一些難點(diǎn)問(wèn)題二 3) 作用域鏈相關(guān)的問(wèn)題 作用域鏈?zhǔn)莏avascript語(yǔ)言里非常紅的概念,很多學(xué)習(xí)和使用javascript語(yǔ)言的程序員都知道作用域鏈?zhǔn)抢斫鈐avascript里很重要的一些概念的關(guān)鍵,這些概念包括this指針,閉包等等,它非常紅的另一個(gè)重要原因就...
摘要:以上描述,全部符合閉包的描述,那這就是閉包。二執(zhí)行過(guò)程之前的文章講了函數(shù)的執(zhí)行上下文棧,變量對(duì)象,作用域鏈等內(nèi)容,接下來(lái)通過(guò)閉包代碼回顧代碼是怎么樣的執(zhí)行過(guò)程。將活動(dòng)對(duì)象壓入作用域鏈頂端。函數(shù)執(zhí)行結(jié)束,彈出執(zhí)行上下文棧。 本文一共 1300 字,讀完只需 5 分鐘 概述 閉包, 可以說(shuō)是每個(gè)前端工程師都聽(tīng)說(shuō)的一個(gè)詞,咋一看很難從字面上去理解,從而給人留下了閉包是一個(gè)重要又難以理解的...
前言 JavaScript中有一個(gè)被稱為作用域(Scope)的特性。雖然對(duì)于許多新手開(kāi)發(fā)者來(lái)說(shuō),作用域的概念并不是很容易理解,本文我會(huì)盡我所能用最簡(jiǎn)單的方式來(lái)解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運(yùn)行時(shí)代碼中的某些特定部分中變量,函數(shù)和對(duì)象的可訪問(wèn)性。換句話說(shuō),作用域決定了代碼區(qū)塊中變量和其他資源的可見(jiàn)...
前言 JavaScript中有一個(gè)被稱為作用域(Scope)的特性。雖然對(duì)于許多新手開(kāi)發(fā)者來(lái)說(shuō),作用域的概念并不是很容易理解,本文我會(huì)盡我所能用最簡(jiǎn)單的方式來(lái)解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運(yùn)行時(shí)代碼中的某些特定部分中變量,函數(shù)和對(duì)象的可訪問(wèn)性。換句話說(shuō),作用域決定了代碼區(qū)塊中變量和其他資源的可見(jiàn)...
摘要:執(zhí)行環(huán)境又稱作執(zhí)行上下文,其作用就是規(guī)定了對(duì)環(huán)境內(nèi)的變量還有函數(shù)的操作權(quán)利,主要分為全局的執(zhí)行環(huán)境和局部的執(zhí)行環(huán)境。創(chuàng)建作用域鏈的作用主要是讓每個(gè)嵌套關(guān)聯(lián)的執(zhí)行環(huán)境中的變量和函數(shù)有序的調(diào)用和操作。 1 執(zhí)行環(huán)境(exeution context)又稱作執(zhí)行上下文,其作用就是規(guī)定了對(duì)環(huán)境內(nèi)的變量還有函數(shù)的操作權(quán)利,主要分為全局的執(zhí)行環(huán)境和局部的執(zhí)行環(huán)境。 2 當(dāng)一段代碼進(jìn)行運(yùn)行的時(shí)候...
閱讀 1053·2021-11-15 18:11
閱讀 3174·2021-09-22 15:33
閱讀 3469·2021-09-01 11:42
閱讀 2663·2021-08-24 10:03
閱讀 3630·2021-07-29 13:50
閱讀 2932·2019-08-30 14:08
閱讀 1282·2019-08-28 17:56
閱讀 2266·2019-08-26 13:57