中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

javascript執行環境及作用域詳解
來源:易賢網 閱讀:1259 次 日期:2016-07-06 09:23:53
溫馨提示:易賢網小編為您整理了“javascript執行環境及作用域詳解”,方便廣大網友查閱!

這篇文章主要為大家詳細介紹了javascript執行環境及作用域,分別針對javascript執行環境及作用域進行探討,感興趣的小伙伴們可以參考一下

最近在重讀《javascript高級程序設計3》,覺得應該寫一些博客記錄一下學習的一些知識,不然都忘光啦。今天要總結的是js執行環境和作用域。

首先來說一下執行環境 

一、執行環境

書上概念,執行環境定義了變量或者函數有權訪問的其他數據,決定了他們各自的行為。每個執行環境都有一個與之關聯的變量對象。環境中定義的所有變量和函數都保存在這個對象中。雖然我們在編寫代碼的時候無法訪問這個對象,但解析器在處理數據時會在后臺用到它。

執行環境是一個概念,一種機制,它定義了變量或函數是否有權訪問其他數據

在javascript中,可執行的JavaScript代碼分三種類型: 

1. Global Code,即全局的、不在任何函數里面的代碼,例如:一個js文件、嵌入在HTML頁面中的js代碼等。 

2. Eval Code,即使用eval()函數動態執行的JS代碼。 

3. Function Code,即用戶自定義函數中的函數體JS代碼。

跳過Eval Code,只說全局執行環境和函數執行環境。 

1、全局環境:

全局環境是最外圍的一個執行環境。全局執行環境被認為是window對象。因此所有全局變量和函數都是作為window對象的屬性和方法創建的。代碼載入瀏覽器時,全局執行環境被創建(當我們關閉網頁或者瀏覽器時全局執行環境才被銷毀)。比如在一個頁面中,第一次載入JS代碼時創建一個全局執行環境。

這也是為什么閉包有一個內存泄露的缺點。因為閉包中外部函數被當成了全局環境。所以不會被銷毀,一直保存在內存中。

2、函數執行環境

每個函數都有自己的執行環境,當執行進入一個函數時,函數的執行環境就會被推入一個執行環境棧的頂部并獲取執行權。當這個函數執行完畢,它的執行環境又從這個棧的頂部被刪除,并把執行權并還給之前執行環境。這就是ECMAScript程序中的執行流。

也可以這樣解讀:當調用一個 JavaScript 函數時,該函數就會進入與該函數相對應的執行環境。如果又調用了另外一個函數,則又會創建一個新的執行環境,并且在函數調用期間執行過程都處于該環境中。當調用的函數返回后,執行過程會返回原始執行環境。因而,運行中的 JavaScript 代碼就構成了一個執行環境棧。

當函數被調用時函數的局部環境被創建(函數內的代碼執行完畢后,該環境被銷毀,同時保存在其中的所有變量和函數定義也隨之被銷毀)。

2-1定義期 

函數定義的時候,都會創建一個[[scope]]屬性,通這個對象對應的是一個對象的列表,列表中的對象僅能javascript內部訪問,沒法通過語法訪問。

(scope也就是作用域的意思。) 

我們定義一全局函數A,那么A函數就創建了一個A的[[scope]]屬性。此時,[[scope]]里面只包含了全局對象【Global Object】。

而如果, 我們在A的內部定義一個B函數,那B函數同樣會創建一個[[scope]]屬性,B的[[scope]]屬性包含了兩個對象,一個是A的活動對象Activation Object、一個是全局對象,A的活動對象在前面,全局對象排在后面。

簡而言之,一個函數的[Scope]屬性中對象列表的順序是上一層函數的Activation Object對象,然后是上上層的,一直到最外層的全局對象。  

下面是示例代碼:A只有一個scope,B有兩個scope

// 外部函數

function A(){

  var somevar;

  // 內部函數

 function B(){

   var somevar;

  }

}

2-2執行期 

當函數被執行的時候,就是進入這個函數的執行環境,首先會創一個它自己的活動對象【Activation Object】(這個對象中包含了this、參數(arguments)、局部變量(包括命名的參數)的定義和一個變量對象的作用域鏈[[scope chain]],然后,把這個執行環境的[scope]按順序復制到[[scope chain]]里,最后把這個活動對象推入到[[scope chain]]的頂部。這樣[[scope chain]]就是一個有序的棧,這樣保了對執行環境有權訪問的所有變量和對象的有序訪問。

// 第一步頁面載入創全局執行環境global executing context和全局活動象

// 定義全局[[scope]],只含有Window對象

// 掃描全局的定義變量及函數對象:color【undefined】、changecolor【FD創建changecolor的[[scope]],此時里面只含有全局活動對象】,加入到window中,所以全局變量和全局函數對象都是做為window的屬性定義的。

// 程序已經定義好所以在此執行環境內任何位置都可以執行changecolor(),color也已經被定義,但是它的值是undefined

// 第二步color賦值"blue"

var color = "blue";

// 它是不需要賦值的,它就是引用本身

function changecolor() {

 // 第四步進入changecolor的執行環境

 // 復制changecolor的[[scope]]到scope chain

 // 創建活動對象,掃描定義變量和定義函數,anothercolor【undefined】和swapcolors【FD創建swapcolors的[[scope]]加入changecolor的活動對象和全局活動對象】加入到活動對象,活動對象中同時還要加入arguments和this

 // 活動對象推入scope chain 頂端

 // 程序已經定義好所以在此執行環境內任何位置都可以執行swapcolors(),anothercolor也已經被定義好,但它的值是undefined

 // 第五anothercolor賦值"red"

 var anothercolor = "red";

 // 它是不需要賦值的,它就是引用本身

 function swapcolors() {

  // 第七步進入swapcolors的執行環境,創建它的活動對象

  // 復制swapcolors的[[scope]]到scope chain

  // 掃描定義變量和定義函數對象,活動對象中加入變量tempcolor【undefined】以及arguments和this

  // 活動對象推入scope chain 頂端

  // 第八步tempcolor賦值anothercolor,anothercolor和color會沿著scope chain被查到,并繼續往下執行

  var tempcolor = anothercolor;

   anothercolor = color;

   color = tempcolor; 

 }

 // 第六步執行swapcolors,進入其執行環境

 swapcolors();

}

// 第三步執行changecolor,進入其執行環境

changecolor();

2-3訪問標識符:

當執行js代碼的過程中,遇到一個標識符,就會根據標識符的名稱,在執行上下文(Execution Context)的作用域鏈中進行搜索。從作用域鏈的第一個對象(該函數的Activation Object對象)開始,如果沒有找到,就搜索作用域鏈中的下一個對象,如此往復,直到找到了標識符的定義。如果在搜索完作用域中的最后一個對象,也就是全局對象(Global Object)以后也沒有找到,則會拋出一個錯誤,提示undefined。  

二、Scope/Scope Chain(作用域/作用域鏈)

 當代碼在一個環境中執行時,都會創建一個作用域鏈。 作用域鏈的用途是保證對執行環境有權訪問的所有變量和函數的有序訪問。整個作用域鏈是由不同執行位置上的變量對象按照規則所構建一個鏈表。作用域鏈的最前端,始終是當前正在執行的代碼所在環境的變量對象。

如果這個環境是函數,則將其活動對象(activation object)作為變量對象?;顒訉ο笤谧铋_始時只包含一個變量,就是函數內部的arguments對象。作用域鏈中的下一個變量對象來自該函數的包含環境,而再下一個變量對象來自再下一個包含環境。這樣,一直延續到全局執行環境,全局執行環境的Variable Object始終是作用域鏈中的最后一個對象。

如圖所示:

名單

書中例子:

var color="blue";

 function changecolor(){

 var anothercolor="red";

 function swapcolors(){

 var tempcolor=anothercolor;

 anothercolor=color;

 color=tempcolor;

  // Todo something  

  }

 swapcolors();

}

changecolor();

 //這里不能訪問tempcolor和anocolor;但是可以訪問color;

alert("Color is now "+color);

   通過上面的分析,我們可以得知內部環境可以通過作用域鏈訪問所有的外部環境,但外部環境不能訪問內部環境中的任何變量和函數。

這些環境之間是線性、有次序的。每個環境都可以向上搜索作用域鏈,以便查詢變量和函數名;但任何環境不能通過向下搜索作用域鏈條而進入另一個執行環境。

對于上述例子的swapcolor()函數而言,其作用域鏈包括:swapcolor()的變量對象、changecolor()變量對象和全局對象。swapcolor()的局部環境開始先在自己的Variable Object中搜索變量和函數名,找不到,則向上搜索changecolor作用域鏈。。。。。以此類推。但是,changecolor()函數是無法訪問swapcolor中的變量

 啟示:盡量使用局部變量,能夠減少搜索的時間 

1、沒有塊級作用域

與C、C++以及JAVA不同,Javscript沒有塊級作用域??聪旅娲a:

if(true){

  var myvar = "張三"; 

 }

 alert(myvar);// 張三

如果有塊級作用域,外部是訪問不到myvar的。再看下面 

for (var i=0;i<10;i++){

   console.log(i) 

  }

  alert(i); // 10

對于有塊級作用域的語言來說,比如java或是c#代碼,i做為for初始化的變量,在for之外是訪問不到的。因為i只存在于for循環體重,在運行完for循環后,for中的所有變量就被銷毀了。而在javascript中則不是這樣的,在for中的變量聲明將會添加到當前的執行環境中(這里是全局執行環境),因此在for循環完后,變量i依舊存在于循環外部的執行環境。因此,會輸出10。

 2、聲明變量

   使用var聲明變量時,這個變量將被自動添加到距離最近的可用環境中。對于函數內部,最接近的環境就是函數的局部變量。如果初始化變量時沒有使用var,該變量會自動添加到全局函數中。

代碼如下:

var name = "小明";

function getName(){

 alert( name ); //'undefined'

 var name = '小黃';

 alert(name ); //小黃

}

getName()

為什么第一個name是undefined呢。這是因為,javascript解析器,進入一個函數執行環境,先對var 和 function進行掃描。

相當于會把var或者function【函數聲明】聲明提升到執行環境頂部。

也就是說,進入我們的getName函數的時候,標識符查找機制查找到了var,查找的name是局部變量name,而不是全局的name,因為函數里面的name被提升到了頂部。

上面的代碼會被解析成下面這樣:

var name = "小明";

function getName(){

 var name;

 alert( name ); //'undefined'

 var name = '小黃';

 alert(name ); //小黃

}

getName()

延長作用域鏈:

雖然執行環境只有兩種——全局作用域和函數作用域,但是還是可以通過某種方式來延長作用域鏈。因為有些語句可以在作用域鏈的頂部增加一個臨時的變量對象。

有兩種情況會發生這種現象:

1、try-catch語句的catch塊;

2、with語句;

以上就是本文的全部內容,希望對大家學習理解javascript執行環境及作用域有所幫助。

更多信息請查看網絡編程
易賢網手機網站地址:javascript執行環境及作用域詳解
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
中文欧美字幕免费| 欧美日本一区| 欧美日韩国产成人在线免费| 在线观看一区视频| 美女网站久久| 宅男精品视频| 在线观看中文字幕不卡| 欧美日韩国产综合久久| 亚洲欧美另类在线| 伊人久久亚洲热| 欧美深夜影院| 久久精品中文字幕一区二区三区| 亚洲国产乱码最新视频| 欧美午夜精品久久久久久浪潮| 亚洲一区精品视频| 最新亚洲激情| 影音先锋在线一区| 国产精品一区二区三区观看| 欧美电影在线观看| 欧美一区亚洲二区| 99在线热播精品免费99热| 亚洲丰满少妇videoshd| 国产精品一区视频| 国产精品免费电影| 欧美三级日韩三级国产三级| 国产欧美日韩一区二区三区在线| 欧美在线视频在线播放完整版免费观看 | 麻豆精品一区二区综合av| 欧美激情第二页| 久久福利资源站| 欧美一区二区三区播放老司机 | 欧美大色视频| 午夜精品久久久久久久久| 欧美日韩精品系列| 欧美激情导航| 老巨人导航500精品| 男女激情视频一区| 欧美激情国产高清| 久久亚洲视频| 欧美日本久久| 国产精品丝袜久久久久久app | 欧美日韩午夜视频在线观看| 久久综合免费视频影院| 久久久五月婷婷| 免费观看在线综合| 国产精品久久久一区二区| 欧美日韩综合一区| 欧美伦理影院| 欧美在线观看日本一区| 久久九九免费| 欧美日韩日本国产亚洲在线| 国产精品亚洲片夜色在线| 在线观看精品| 欧美影院精品一区| 欧美日韩亚洲一区三区 | 亚洲欧洲一区二区三区在线观看| 影音先锋中文字幕一区| 日韩视频一区| 久久久噜噜噜久久狠狠50岁| 欧美精品一区二区三区四区 | 久久久夜夜夜| 国产精品综合视频| 亚洲一区免费| 欧美日韩中文字幕综合视频| 亚洲国产欧美一区二区三区同亚洲| 亚洲欧美日本日韩| 国产精品久久久久久久免费软件 | 亚洲欧美日韩一区二区| 美女尤物久久精品| 国产一区二区高清视频| 99成人免费视频| 免费久久精品视频| 永久免费精品影视网站| 久久精品亚洲| 亚洲第一精品电影| 欧美日本国产在线| 亚洲综合色自拍一区| 国产精品国内视频| 亚洲欧美日韩一区二区三区在线观看| 国产精品va在线| 久久精品官网| 亚洲国产欧洲综合997久久| 欧美成人性网| 亚洲调教视频在线观看| 国产精品色网| 美女脱光内衣内裤视频久久网站| 精品成人在线视频| 久久久久成人精品| 亚洲啪啪91| 国产欧美一区二区精品性| 麻豆91精品| 午夜精品久久久久久久99热浪潮| 国产女人水真多18毛片18精品视频| 久久福利影视| 99爱精品视频| 亚洲三级色网| 亚洲国产精品一区在线观看不卡| 欧美视频在线观看视频极品| 久久亚洲欧洲| 久久精品二区三区| 欧美一乱一性一交一视频| 91久久综合亚洲鲁鲁五月天| 国产一区二区黄| 国产精品视频网| 国产区亚洲区欧美区| 国产精品国产三级国产专播精品人| 美女脱光内衣内裤视频久久网站| 午夜精品福利一区二区蜜股av| 亚洲毛片在线| 一区二区三区精品| 久久精品中文字幕免费mv| 宅男精品视频| 黄色日韩网站视频| 亚洲高清在线| 国产精品99久久久久久久久| 亚洲一区在线免费| 欧美中文字幕在线| 欧美成人tv| 国产精品乱码妇女bbbb| 国产欧美精品在线| 亚洲精品一区二区三区不| 亚洲午夜精品视频| 久久综合导航| 国产视频一区二区在线观看| 樱桃成人精品视频在线播放| 中文在线一区| 欧美aaaaaaaa牛牛影院| 国产精品一区二区在线观看| 亚洲国产成人久久| 香港成人在线视频| 欧美巨乳在线| 亚洲国产精品电影| 毛片av中文字幕一区二区| 国产精品啊啊啊| 一本色道久久88综合亚洲精品ⅰ | 午夜精品免费在线| 欧美日韩国产综合新一区| 国产主播一区| 欧美专区第一页| 国产精品高潮粉嫩av| 亚洲伦理在线免费看| 免费日韩视频| 亚洲精品在线三区| 国产精品三上| 欧美成人在线影院| 在线一区二区三区四区五区| 亚洲高清资源| 伊人久久综合97精品| 国内久久视频| 国产精品美腿一区在线看| 欧美日韩一视频区二区| 欧美大尺度在线| 免费观看久久久4p| 欧美成人四级电影| 欧美大片免费久久精品三p| 欧美激情一区二区在线 | 欧美一区免费视频| 1024国产精品| 亚洲精品久久久久久下一站| 欧美国产亚洲精品久久久8v| 麻豆av一区二区三区| 中文国产一区| 久久婷婷国产综合精品青草| 欧美性一二三区| 日韩亚洲精品视频| 欧美激情一区二区三区高清视频| 蜜臀av在线播放一区二区三区| 国产欧美大片| 久久一本综合频道| 亚洲精品美女在线观看播放| 久久精品日韩欧美| 国产精品福利在线观看| 亚洲欧美激情一区| 在线观看不卡| 久热精品视频在线免费观看| 国产麻豆精品theporn| 猫咪成人在线观看| 欧美在线不卡| 日韩视频一区二区在线观看| 国产欧美1区2区3区| 欧美视频导航| 欧美巨乳波霸| 久久男人资源视频| 西瓜成人精品人成网站| 亚洲美女黄色| 国产一区二区三区四区五区美女| 久久人人看视频| 久久久久久久网| 欧美在线你懂的| 一本色道久久综合亚洲精品不| 国内精品久久久| 精品二区视频| 一本久道久久综合婷婷鲸鱼| 国产亚洲美州欧州综合国| 国产精品夜夜夜一区二区三区尤| 欧美成人在线影院| 欧美1区2区视频| 美腿丝袜亚洲色图| 欧美高清你懂得| 欧美激情一区二区|