国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

淺談javascript中執行環境(作用域)與作用域鏈

2024-05-06 16:33:27
字體:
來源:轉載
供稿:網友

相信很多初學者對與javascript中的執行環境與作用域鏈不能很好的理解,這里,我會按照自己的理解同大家一起分享。

一般情況下,我們把執行環境分為全局執行環境和局部執行環境,其中局部執行環境我們又可以稱之為函數執行環境。那么究竟什么使執行環境呢?通俗的說,執行環境即為代碼執行時所處的環境。我們下來看一看如下代碼,再進一步分析之。

<script><br>var name="zhuzhenwei";function changeName(){    if (name=="zhuzhenwei"){          name="heting";    }else{          name="zhuzhenwei";    }}changeName();console.log(name); //heting<br></script>

如上述代碼,當執行第一個語句時,該語句所在的環境為全局執行環境,應當注意的是:每個執行環境都有一個與之相關聯的變量對象,對于全局執行環境,與它向關聯的對象為window對象。緊接著,下面這條語句聲明了一個函數(注意:這里僅僅是聲明了函數,沒有被調用之前是不會執行內部代碼的)。  同樣這個函數也是處于全局執行環境的。最后,我們調用了changeName()函數,一旦調用了該函數,那么立即跳轉到了changeName()函數的執行環境(即函數執行環境),一旦進入執行環境,便開始創建函數內部相應的變量(如函數中假設出現var a=12;這樣的代碼),不調用函數是不會創建的,且與之相關的變量對象我們認為是活動對象(活動對象開始只包含一個變量,即arguments對象),自此開始從上到下執行語句。與此同時,代碼在函數環境中執行時,就會創建變量對象的一個作用域鏈,這個作用域鏈包含changeName()的變量對象和全局變量對象。

作用域鏈實際上就是我們可以通過它從前端到末端可以訪問的范圍,即保證對執行環境有權訪問的所有變量和函數的有序訪問,其中前端是指當前執行代碼所在的變量對象,這里現在就是changeName()函數的變量對象,末端是全局變量對象,比如說:我們在執行函數時,需要尋找一個標識符,這是就是通過作用域鏈的末端進行尋找,若作用域鏈的末端找不到,就一直向上尋找,直到window對象。雖然在全局環境中我沒有提到作用域鏈,但實際上全局環境中作用域鏈也是存在的,只是只有一個全局變量對象。 很明顯:訪問局部變量比訪問全局變量更快,因為不用向上搜索作用域鏈。顯然,作用域鏈是隨著代碼所處的執行環境的不同而動態變化的。           

當執行完changeName()函數之后,即函數執行環境中的代碼執行完成之后,該環境中的局部變量和局部對象會被立即銷毀(如果變量沒有用var聲明,表明是全局變量,不會在局部環境的代碼執行之后銷毀),隨即執行環境由函數執行環境轉向全局執行環境,繼續執行console.log(name);語句。只是,如果我們關閉網頁或瀏覽器,全局環境也將被銷毀。

總結如下:

  • 執行環境也成為作用域,執行環境決定了變量的生命周期。
  • 執行環境有全局執行環境和局部執行環境之分,每進入一個執行環境就會創建一個用于搜索變量和函數的作用域鏈,于是我們認為這個作用域鏈是動態變化的。
  • 函數的局部環境不僅有權訪問函數作用域中的變量,而且有權訪問其包含環境(父環境),乃至全局環境;而全局環境只能訪問在全局環境中定義的變量和函數(局部環境中未使用var聲明的變量也屬于全局變量),不能訪問局部環境中的數據(沒有說所有數據,正是因為全局變量可以訪問)。注意:函數中的參數時函數的局部變量。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時也希望多多支持VeVb武林網!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新竹市| 宜宾县| 安仁县| 牙克石市| 涟源市| 高雄市| 淮阳县| 重庆市| 稻城县| 铜山县| 康定县| 锦屏县| 阿巴嘎旗| 巩留县| 松江区| 龙海市| 封开县| 来凤县| 宜黄县| 江都市| 临安市| 金沙县| 德昌县| 手机| 郓城县| 瑞金市| 凤城市| 兰考县| 平阴县| 吉安市| 武鸣县| 娱乐| 抚松县| 延吉市| 涞水县| 额济纳旗| 庆安县| 金塔县| 广德县| 威信县| 罗城|