1. 程式人生 > 其它 >深入理解作用域鏈

深入理解作用域鏈

  • 為了更好的理解作用域鏈,有以下程式碼示例:

      var a = 'aaa'

      try{
        console.log('1',a,b,c,d);
      }catch(err){
        console.log('1',err);
      }

      function fn1(){
        var b = 'bbb'
        try{
          console.log('2',a,b,c,d);
        }catch(err){
          console.log('2',err);
        }
        function fn2(){
          var c = 'ccc'
          try{
            console.log('3',a,b,c,d);
          }catch(err){
            console.log('3',err);
          }
          function fn3(){
            var d = 'ddd'
            try{
              console.log('4',a,b,c,d);
            }catch(err){
              console.log('4',err);
            }
          }
          fn3()
        }
        fn2()
      }

      fn1()
   

分析一下:
此段程式碼涉及4個全域性上下文,分別是 全域性上下文,fn1()區域性上下文,fn2()區域性上下文,fn3()區域性上下文
全域性上下文有一個a變數,一個fn1()函式
fn1()區域性上下文有一個b變數,一個fn2()函式
fn2()區域性上下文有一個c變數,一個fn3()函式
fn3()區域性上下文有一個d變數

看一下以上程式碼的輸出:

讓我來畫個圖便於理解:

即查詢變數時會沿著作用域鏈向上查詢,而不是向下查詢,且找到最近的就會停止(就近原則)