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