javascript基礎(chǔ)進(jìn)階_深入剖析執(zhí)行環(huán)境及作用域鏈
執(zhí)行環(huán)境
執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問(wèn)的其他函數(shù),決定了他們各自的行為。每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象。
變量對(duì)象
環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對(duì)象中。
全局執(zhí)行環(huán)境
全局執(zhí)行環(huán)境是最外圍的一個(gè)執(zhí)行環(huán)境。在web瀏覽器中,全局執(zhí)行環(huán)境被認(rèn)為是Window對(duì)象,因此所有全局變量和函數(shù)都是作為window對(duì)象的屬性和方法創(chuàng)建的。
每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境。
作用域鏈
當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行,會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈。
用途:保證對(duì)執(zhí)行環(huán)境有權(quán)訪問(wèn)的所有變量和函數(shù)有序訪問(wèn)。
特點(diǎn):作用域鏈的前端始終是當(dāng)前執(zhí)行的代碼所在的環(huán)境的變量對(duì)象。如果這個(gè)環(huán)境是函數(shù),則將其活動(dòng)對(duì)象作為變量對(duì)象。活動(dòng)對(duì)象最開始只包含arguments對(duì)象。作用域的下一個(gè)變量對(duì)象來(lái)自包含環(huán)境,而再下個(gè)來(lái)自下一個(gè)包含環(huán)境。
var color ="blue";
function changeColor() {
var anotherColor ="red";
function swapColors() {
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
}
swapColors();
}
changeColor();
如圖表示執(zhí)行環(huán)境,內(nèi)部環(huán)境可以通過(guò)作用域鏈訪問(wèn)外部環(huán)境,但是外部環(huán)境不能訪問(wèn)內(nèi)部環(huán)境中的變量和函數(shù)。每個(gè)環(huán)境都可以向上搜索作用域鏈,以查詢變量和函數(shù);但是不能向下搜索。

沒(méi)有塊級(jí)作用域 聲明變量
使用var聲明的變量會(huì)自動(dòng)添加到最接近的環(huán)境中。如果省略var關(guān)鍵字,即會(huì)添加到全局環(huán)境中。
function add(num1,num2) {
var sum = num1+num2;
return sum;
}
var result= add(10,10)
console.log(sum)

sum is not defined
function add(num1,num2) {
sum = num1+num2;
return sum;
}
var result= add(10,10)
console.log(sum)

查詢標(biāo)識(shí)符
搜索過(guò)程從作用域鏈的前端開始,向上逐級(jí)查詢與給定名字匹配的標(biāo)識(shí)符,找到即終止搜索。即如果局部環(huán)境中存在著同名標(biāo)識(shí)符,就不會(huì)使用位于父環(huán)境中的標(biāo)志符。
var color ="red";
function getColor() {
return color;
}
console.log(getColor())

var color ="red";
function getColor() {
var color="green";
return color;
}
console.log(getColor())

參考:《javascript高級(jí)程序設(shè)計(jì)(第三版)》
以上這篇javascript基礎(chǔ)進(jìn)階_深入剖析執(zhí)行環(huán)境及作用域鏈就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
webpack中的filename 和 chunkFilename 的區(qū)別實(shí)例解析
filename 指列在 entry 中,打包后輸出的文件的名稱,chunkFilename 指未列在 entry 中,卻又需要被打包出來(lái)的文件的名稱,這篇文章主要介紹了webpack中的filename 和 chunkFilename 的區(qū)別實(shí)例解析,需要的朋友可以參考下2023-11-11
javascript中eval和with用法實(shí)例總結(jié)
這篇文章主要介紹了javascript中eval和with用法,結(jié)合實(shí)例形式總結(jié)分析了JavaScript中eval和with的功能、用法與相關(guān)注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
flexslider.js實(shí)現(xiàn)移動(dòng)端輪播
本文主要分享了flexslider.js實(shí)現(xiàn)移動(dòng)端輪播的示例代碼,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
怎么在下面的HTML里調(diào)用數(shù)組cs[]的值
怎么在下面的HTML里調(diào)用數(shù)組cs[]的值...2007-01-01
JS實(shí)現(xiàn)提示框跟隨鼠標(biāo)移動(dòng)
在本篇內(nèi)容里小編給各位整理了一篇關(guān)于JS實(shí)現(xiàn)提示框跟隨鼠標(biāo)移動(dòng)的相關(guān)實(shí)例代碼,需要的朋友們學(xué)習(xí)下。2019-08-08
微信小程序?qū)崿F(xiàn)簡(jiǎn)單手寫簽名組件的方法實(shí)例
在使用微信的時(shí)候,為方便我們發(fā)送文件可以直接在上面進(jìn)行手寫簽名,這篇文章主要給大家介紹了關(guān)于利用微信小程序?qū)崿F(xiàn)簡(jiǎn)單手寫簽名組件的相關(guān)資料,需要的朋友可以參考下2021-07-07
js+css實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲
這篇文章主要為大家詳細(xì)介紹了js+css實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
javascript中2個(gè)感嘆號(hào)的用法實(shí)例詳解
這篇文章主要介紹了javascript中2個(gè)感嘆號(hào)的用法,并用大量的實(shí)例講述了!!的常見(jiàn)應(yīng)用情況,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09
原生JavaScript創(chuàng)建不可變對(duì)象的方法簡(jiǎn)單示例
這篇文章主要介紹了原生JavaScript創(chuàng)建不可變對(duì)象的方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了基于原生JavaScript創(chuàng)建不可變對(duì)象的相關(guān)原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05

