本文實例講述了JavaScript執行環境及作用域鏈。分享給大家供大家參考,具體如下:
1、執行環境:
每個執行環境都有一個與之關聯的變量對象,環境中定義的所有變量和函數都保存在這個對象中。
執行環境包括全局執行環境和函數執行環境。
全局執行環境是最外圍的一個執行環境,在瀏覽器中,全局執行環境被認為是是window對象,所有全局變量和屬性都是作為window對象的屬性和方法創建的。
函數執行環境是指函數的執行環境,當執行流進入一個函數時,函數的環境會被推入一個環境棧中,在函數執行之后,棧將其環境彈出,將控制權返回到之前的執行環境。
2、作用域鏈:
當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈。
作用域鏈的用途:保證對執行環境有權訪問的所有變量和函數的有序訪問。
作用域鏈的前端,始終是當前執行的代碼所在環境的變量對象,若此環境是函數,則將其活動對象作為變量對象。活動對象最開始時只包含一個變量,即arguments對象(該對象在全局環境中是不存在的),作用域鏈的下一個對象來自包含環境,再下一個變量則來自下一個包含環境,這樣一直延續到全局執行環境。全局執行環境的變量對象始終是作用域鏈的最后一個對象。
每個環境都可以向上搜索作用域鏈,以查詢變量和函數名,終點就是搜索到全局執行環境,但是任何環境不能通過向下搜索作用域鏈而進入另一個執行環境。內部環境可以通過作用域鏈訪問所有的外部環境,但外部環境不能訪問內部環境的任何變量和函數。
3、延長作用域鏈:
雖然執行環境只有兩種:全局執行環境和函數執行環境,但是可以有方法延長作用域鏈,因為有些語句可以在作用域鏈的前端臨時增加一個變量對象,該變量對象會在代碼執行后被移除。
當執行流進入下列語句時,作用域鏈會延長:
(1)try-catch語句的catch塊:catch語句會創建一個新的變量對象,其中包含的是被拋出的錯誤對象的聲明,該變量對象只在catch塊內部有效,在catch塊外部無法訪問到。
(2)with語句:with
語句會將指定的對象添加到作用域鏈中。
eg1:
function setUrl(){ var parameter="?name=Alice"; var url = href + parameter; return url; } var result = setUrl(); alert(result);//報錯:href is no defined
eg2:
function setUrl(){ var parameter="?name=Alice"; with(location) { var url = href + parameter; } return url; } var result = setUrl(); alert(result);//http://localhost/text.html?name=Alice
with
語句接收的是location對象,因此其變量對象中包含了location對象的所有屬性和方法,location對象被添加到了作用域鏈的前端。
eg3:
var obj = {href : "http://www.baidu.com"}; var ; function setUrl(){ var parameter="?name=Alice"; with(obj) { ; var url = href + parameter; } return url; } var result = setUrl(); alert(result);//http://www.google.cn?name=Alice alert(href);//http://www.sina.cn
with
語句中并沒有更改變量href的值,而是更改了obj對象的 href
屬性。
也就是說,with
中首先查找的是相關對象的屬性,如果沒有,才改變變量的值。
eg4:
var obj = {}; var ; function setUrl(){ var parameter="?name=Alice"; with(obj) { ; var url = href + parameter; } return url; } var result = setUrl(); alert(result);//http://www.google.cn?name=Alice alert(href);//http://www.google.cn
去掉obj對象的 href
屬性后,才更改變量href
的值。
更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript常用函數技巧匯總》、《javascript面向對象入門教程》、《JavaScript數據結構與算法技巧總結》、《JavaScript查找算法技巧總結》及《JavaScript錯誤與調試技巧總結》
希望本文所述對大家JavaScript程序設計有所幫助。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com