摘要:一執(zhí)行環(huán)境與作用域鏈?zhǔn)裁词菆?zhí)行環(huán)境執(zhí)行環(huán)境定義了變量和函數(shù)的訪問權(quán)限,決定了他們的各自行為。
一、執(zhí)行環(huán)境與作用域鏈 1.什么是執(zhí)行環(huán)境
執(zhí)行環(huán)境定義了變量和函數(shù)的訪問權(quán)限,決定了他們的各自行為。每個執(zhí)行環(huán)境都有一個與之關(guān)聯(lián)的變量對象,環(huán)境中定義的所有對象和函數(shù)都保存在這個對象里。
全局環(huán)境是最外圍的一個執(zhí)行環(huán)境,在Web瀏覽器里全局執(zhí)行環(huán)境被認(rèn)為是window對象
某個執(zhí)行環(huán)境中所有代碼執(zhí)行完畢后該環(huán)境被銷毀
每個函數(shù)都自己的執(zhí)行環(huán)境,當(dāng)執(zhí)行流進入一個函數(shù)時,函數(shù)的執(zhí)行環(huán)境就會被壓入環(huán)境棧中,函數(shù)執(zhí)行完將環(huán)境彈出棧,把控制權(quán)返回之前的執(zhí)行環(huán)境
2.作用域鏈及其作用代碼在某個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈
通過作用域鏈保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問
作用域鏈的前端是當(dāng)前執(zhí)行的代碼所在環(huán)境的變量對象
例:
var name1 = "11111"; function changeName(){ var name2 = "22222"; function swapName(){ var tmpName = name1; name1 = name2; name2 = tmpName; } swapName(); } changeName();
執(zhí)行環(huán)境棧如下:從棧頂向棧底搜索變量
上述代碼中共有三個執(zhí)行環(huán)境:全局環(huán)境、changeName局部環(huán)境和swapName局部環(huán)境;其中全局環(huán)境變量對象中有name1變量和changeName函數(shù),changeName環(huán)境變量對象中有name2變量和swapName函數(shù),swapName環(huán)境變量對象中有tmpName變量;全局環(huán)境和changeName局部環(huán)境都不能訪問tmpName變量
ES6之前只有全局作用域和函數(shù)作用域
for(var i = 0; i < 5; i++){ console.log(i); } console.log(i); //5
這里的i是在全局執(zhí)行環(huán)境中的,就算for循環(huán)執(zhí)行完全局執(zhí)行環(huán)境中的變量也不會被銷毀
function getSum(){ var sum = 0; for(var i = 0; i < 5; i++){ sum += i; console.log(sum); } console.log(i); //5 } console.log(sum)//報錯
上述代碼中有兩個執(zhí)行環(huán)境,其中g(shù)etSum執(zhí)行環(huán)境中有變量sum、i,所以getSum可以訪問到sum和i,當(dāng)執(zhí)行完getSum后該執(zhí)行環(huán)境被銷毀,全局環(huán)境中訪問不到sum變量
function getSum(){ sum = 0; for(var i = 0; i < 5; i++){ sum += i; console.log(sum); } console.log(i); //5 } console.log(sum)//10
上述代碼中sum變量沒有用var聲明(不推薦這種做法),此時sum屬于全局執(zhí)行環(huán)境中,所以就算函數(shù)執(zhí)行完畢sum依然存在
參考文章:JavaScript高級程序設(shè)計
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/97346.html
摘要:之前一篇文章我們詳細(xì)說明了變量對象,而這里,我們將詳細(xì)說明作用域鏈。而的作用域鏈,則同時包含了這三個變量對象,所以的執(zhí)行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當(dāng)前的函數(shù)調(diào)用棧,為當(dāng)前正在被執(zhí)行的函數(shù)的作用域鏈,為當(dāng)前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學(xué)JavaScrip...
摘要:所以,有另一種說法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實體。所以本文中將以維基百科中的定義為準(zhǔn)即在計算機科學(xué)中,閉包,又稱詞法閉包或函數(shù)閉包,是引用了自由變量的函數(shù)。 閉包(closure)是JavaScript中一個神秘的概念,許多人都對它難以理解,我也一直處于似懂非懂的狀態(tài),前幾天深入了解了一下執(zhí)行環(huán)境以及作用域鏈,可戳查看詳情,而閉包與作用域及作用域鏈的關(guān)系密不可分,所...
摘要:延長作用域鏈下面兩種語句可以在作用域鏈的前端臨時增加一個變量對象以延長作用域鏈, 問題 今天看筆記發(fā)現(xiàn)自己之前記了一個關(guān)于同名標(biāo)識符優(yōu)先級的內(nèi)容,具體是下面這樣的: 形參優(yōu)先級高于當(dāng)前函數(shù)名,低于內(nèi)部函數(shù)名 形參優(yōu)先級高于arguments 形參優(yōu)先級高于只聲明卻未賦值的局部變量,但是低于聲明且賦值的局部變量 函數(shù)和變量都會聲明提升,函數(shù)名和變量名同名時,函數(shù)名的優(yōu)先級要高。執(zhí)行代...
摘要:目錄執(zhí)行環(huán)境與作用域鏈立即執(zhí)行函數(shù)閉包知識點什么是閉包使用閉包的意義與注意點閉包的具體應(yīng)用小結(jié)這是基本語法的函數(shù)部分的第篇文章,主要講述了中比較重要的知識點閉包在講閉包之前,在上一篇函數(shù)二的基礎(chǔ)上,進一步深化執(zhí)行環(huán)境和作用域鏈的知識點,并補 目錄 1.執(zhí)行環(huán)境與作用域鏈 2. 立即執(zhí)行函數(shù) 3. 閉包知識點 3.1 什么是閉包 3.2 使用閉包的意義與注意點 3.3 閉包的具體應(yīng)用 4...
摘要:作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。當(dāng)前的執(zhí)行環(huán)境就是作用域的最前端,標(biāo)識符解析是沿著作用域鏈最前端向后回溯,直到找到標(biāo)志符當(dāng)某個函數(shù)被調(diào)用時,會創(chuàng)建一個執(zhí)行環(huán)境及相應(yīng)的作用域鏈。 變量由于JavaScript變量松散類型的本質(zhì),決定了它只是在特定時間用于保存特定值的一個名字而已。變量分為基礎(chǔ)類型值和引用類型值;基本類型值指的是簡單的數(shù)據(jù)段(Undefi...
閱讀 652·2021-11-24 09:39
閱讀 3012·2021-11-23 10:06
閱讀 981·2021-10-08 10:05
閱讀 754·2019-08-30 10:49
閱讀 1719·2019-08-29 14:08
閱讀 1325·2019-08-29 12:48
閱讀 3320·2019-08-26 14:04
閱讀 3613·2019-08-26 13:50