作用域鏈詳解

在整個JS的整個學習週期中,作用域鏈是一個不太容易理解和掌握的部分,也恰恰是面試中最容易被問到的一個部分。今天就來好好的總結一個什麼是作用域鏈。
1.什麼是作用域鏈?
作用域鏈是在創建完函數的時候就已經生成的,作用域鏈是一條變量對象的鏈,它和執行上下文有關,用於在處理標識符的時候進行變量查詢.
函數上下文的作用域鏈在函數調用的時候創建出來,它包含了活躍對象和該函數的內部[[Scope]]屬性.
當JS需要查找變量X的值的時候(這個過程稱爲變量解析variable resolution),它會從鏈的第一個對象開始查找,如果這個對象有一個名爲x的屬性,則會直接使用這個屬性的值,如果第一個對象中名爲名爲x的屬性,JS會繼續查找鏈上的下一個對象。如果第二個對象依然沒有名爲X的屬性,則會繼續查找下一個,以此類推。如果作用域鏈上沒有任何一個對象含有屬性x,那麼就認爲這段代碼的作用域鏈上不存在x,並拋出一個引用錯誤(referenceError)異常
2.作用域鏈的例子

       (function(){
          var hello="hello,world";
          function welcome(hi){
              alert(hi);        //解析到作用域鏈的第一個對象的屬性
              alert(hello);    //解析到作用域鏈的第二個對象的屬性
          }
          welcome("It's easy");           })();

在js最頂層代碼中(也就是不包括任何函數定義內的代碼),作用域鏈由一個全局對象組成。

在不包含嵌套的函數體內,作用域鏈上有兩個對象,第一個是定義函數參數和局部變量的對象,第二個是全局對象。

在一個嵌套的函數體內,作用域上至少有三個對象。

3.作用域鏈的創建規則(一般這裏面試大大就會讓你描述一下什麼是作用域鏈)

  1. 當定義一個函數的時候(注意注意,是在定義的時候就已經存在了,不是在調用的時候纔有),函數保存了一個作用域鏈
  2. 當調用這個函數的時候,它創建一個新的對象來存儲它的參數或局部變量,並將這個對象添加保存至哪個作用域鏈上,同時創建一個新的更長的表示函數調用作用域的‘’鏈‘
    3.當函數嵌套時,情況會發生變化,每次調用外部函數的時候,內部函數又會重新定義一遍,因爲每次調用外部函數的時候,作用域鏈都是不同的。
    舉個栗子~~~~

var name=”one”; function test(){ var name=”two”; function test1(){
var name=”three”; console.log(name); //three } function test2(){
console.log(name); // two }
test1(); test2(); } test();

4.面試的大坑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章