摘要:作用域鏈的末端始終都是全局執(zhí)行環(huán)境的變量對(duì)象。作用域鏈的用途,是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有權(quán)訪問理解當(dāng)調(diào)用時(shí),函數(shù)被定義并作為局部變量綁定到了作用域鏈上因此函數(shù)無論在哪里調(diào)用這種綁定依然有效因此返回值為。
執(zhí)行環(huán)境定義
全局執(zhí)行環(huán)境定義了變量或者函數(shù)有權(quán)訪問的其他數(shù)據(jù),每個(gè)執(zhí)行環(huán)境都有一個(gè)與之相關(guān)聯(lián)的變量對(duì)象,環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對(duì)象中。我們編寫的代碼無法訪問這個(gè)對(duì)象,但解析器會(huì)在處理數(shù)據(jù)時(shí)在后臺(tái)使用它。
執(zhí)行環(huán)境的創(chuàng)建
在web瀏覽器中,全局執(zhí)行環(huán)境被認(rèn)為是window對(duì)象,因此所有全局變量和函數(shù)都是作為window對(duì)象的屬性和方法創(chuàng)建的。代碼載入瀏覽器時(shí),全局執(zhí)行環(huán)境被創(chuàng)建(當(dāng)我們關(guān)閉網(wǎng)頁或者瀏覽器時(shí)全局執(zhí)行環(huán)境才被銷毀)。
局部執(zhí)行環(huán)境每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境,因此局部執(zhí)行環(huán)境為函數(shù)對(duì)象。當(dāng)函數(shù)被調(diào)用時(shí)函數(shù)的局部環(huán)境被創(chuàng)建(函數(shù)內(nèi)的代碼執(zhí)行完畢后,該環(huán)境被銷毀,同時(shí)保存在其中的所有變量和函數(shù)定義也隨之被銷毀)。
這個(gè)執(zhí)行環(huán)境以及相關(guān)的變量對(duì)象是個(gè)抽象的概念,解釋如下
var a = 1; function fn(num1,num2){ var b = 2; function fnInner(){ var c = 3; alert(a + b + c); } fnInner();//fnInner調(diào)用時(shí)局部執(zhí)行環(huán)境創(chuàng)建 } fn(4,5);//fn調(diào)用時(shí)局部執(zhí)行環(huán)境創(chuàng)建
圖一作用域鏈
javascript函數(shù)的執(zhí)行用到了作用域鏈,這個(gè)作用域鏈是函數(shù)定義的時(shí)候創(chuàng)建的,當(dāng)定義一個(gè)函數(shù)時(shí),它實(shí)際保存一個(gè)作用域鏈。當(dāng)調(diào)用這個(gè)函數(shù)時(shí),它創(chuàng)建一個(gè)新的對(duì)象來存儲(chǔ)它的局部變量,并將這個(gè)對(duì)象添加至保存的作用域鏈。作用域鏈的前端始終都是當(dāng)前執(zhí)行的代碼所在環(huán)境的變量對(duì)象。作用域鏈的末端始終都是全局執(zhí)行環(huán)境的變量對(duì)象。作用域鏈的用途,是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有權(quán)訪問
var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){return scope}; return f; } checkscope()();//local scope
理解:當(dāng)調(diào)用checkscope時(shí),函數(shù)f被定義并作為局部變量綁定到了checkscope作用域鏈上,因此函數(shù)f無論在哪里調(diào)用,這種綁定依然有效,因此返回值為local scope。
var num1 = 1; function Outer(){ var num2 = 2; console.log(num1 + num2);//3 function Inner(){ //這里可以訪問num3,num2,num1 var num3 = 3; console.log(num1 + num2 + num3);//6 } //這里可以訪問num2,Inner(),num1但不能訪問num3 Inner(); } Outer(); console.log(num1);//1,執(zhí)行環(huán)境 //這里只能訪問num1
作用域鏈(向上搜索):內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,但外部環(huán)境不能訪問內(nèi)部環(huán)境中的任何變量和函數(shù)。
var name = "Byron"; function fn(){ var name = "Csper"; console.log(name);//Casper } fn();
越往內(nèi)部的環(huán)境,變量權(quán)重越高。
注意:沒有帶var關(guān)鍵字直接聲明的變量屬于全局變量如直接聲明a = 1,此時(shí)的a為全局變量。
javscript引擎在進(jìn)入作用域時(shí),會(huì)對(duì)代碼分兩輪處理。第一輪,初始化變量。第二輪,執(zhí)行代碼
var a = 1; function prison (a) { console.log(a);//1 var a; console.log(a);//1 } prison(1);函數(shù)執(zhí)行
函數(shù)調(diào)用進(jìn)入執(zhí)行環(huán)境時(shí),首先處理arguments,初始化形參(默認(rèn)值為undefined),然后初始化函數(shù)內(nèi)的函數(shù)聲明,當(dāng)代碼一步一步執(zhí)行時(shí)再初始化函數(shù)內(nèi)的變量聲明(進(jìn)入環(huán)境未開始執(zhí)行代碼時(shí),值為undefined)。所以函數(shù)內(nèi)的初始化順序?yàn)?strong>變量聲明,函數(shù)聲明,形參??梢詮纳蠄D圖一看出。下面我來舉個(gè)例子(整個(gè)全局環(huán)境也是函數(shù))。
alert(typeof fn);//function,函數(shù)聲明提前 alert(typeof fn0);//undefined,變量聲明提前但未賦值 function fn(){ //函數(shù)表達(dá)式 } var fn0 = function(){ //函數(shù)定義式 } alert(typeof fn0);//function,此時(shí)變量已被賦值
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/85838.html
摘要:之前一篇文章我們?cè)敿?xì)說明了變量對(duì)象,而這里,我們將詳細(xì)說明作用域鏈。而的作用域鏈,則同時(shí)包含了這三個(gè)變量對(duì)象,所以的執(zhí)行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當(dāng)前的函數(shù)調(diào)用棧,為當(dāng)前正在被執(zhí)行的函數(shù)的作用域鏈,為當(dāng)前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學(xué)JavaScrip...
摘要:示例當(dāng)一個(gè)函數(shù)創(chuàng)建后,它的作用域鏈會(huì)被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對(duì)象填充。每一個(gè)運(yùn)行期上下文都和一個(gè)作用域鏈關(guān)聯(lián)。此時(shí),作用域鏈中函數(shù)的所有局部變量所在的作用域?qū)ο髸?huì)被推后,訪問代價(jià)變高了。 作用域 作用域就是變量與函數(shù)的可訪問范圍,即作用域控制著變量與函數(shù)的可見性和生命周期。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。 作用域鏈 函數(shù)對(duì)象有一個(gè)內(nèi)部屬性[...
摘要:當(dāng)我將此題的作用域鏈畫出來之后,終于感覺作用域入門了。創(chuàng)建函數(shù)的作用域鏈,并初始化為函數(shù)的所包含的對(duì)象,即包含了的作用域鏈。 作用域 為了理解作用域,跪看了好幾篇大神的博文,終于略知一二。 1.題目 其中,看到這樣一道題(稍作修改): function factory() { var name = laruence; var intro = function(){...
摘要:變量對(duì)象作用域鏈因?yàn)樽兞繉?duì)象在執(zhí)行上下文進(jìn)入執(zhí)行階段時(shí),就變成了活動(dòng)對(duì)象,因此圖中使用了來表示。 作用域 作用域就是變量與函數(shù)的可訪問范圍,即作用域控制著變量與函數(shù)的可見性和生命周期。在 JavaScript 中,變量的作用域有全局作用域和局部作用域兩種。JavaScript 采用詞法作用域(lexical scoping),也就是靜態(tài)作用域。 靜態(tài)作用域 函數(shù)的作用域在函數(shù)定義的時(shí)候...
摘要:變量對(duì)象作用域鏈因?yàn)樽兞繉?duì)象在執(zhí)行上下文進(jìn)入執(zhí)行階段時(shí),就變成了活動(dòng)對(duì)象,因此圖中使用了來表示。 作用域 作用域就是變量與函數(shù)的可訪問范圍,即作用域控制著變量與函數(shù)的可見性和生命周期。在 JavaScript 中,變量的作用域有全局作用域和局部作用域兩種。JavaScript 采用詞法作用域(lexical scoping),也就是靜態(tài)作用域。 靜態(tài)作用域 函數(shù)的作用域在函數(shù)定義的時(shí)候...
閱讀 3533·2021-10-13 09:40
閱讀 2655·2021-10-08 10:17
閱讀 4083·2021-09-28 09:45
閱讀 1006·2021-09-28 09:35
閱讀 1883·2019-08-30 10:51
閱讀 2967·2019-08-26 12:11
閱讀 1707·2019-08-26 10:41
閱讀 3152·2019-08-23 17:10