1. 程式人生 > >JavaScript鏈式作用域

JavaScript鏈式作用域

網上介紹js鏈式作用域的很多,但寫的很煩雜,不好理解,現在根據網路文章整理一個簡單易懂的,如下:

1.理解js的鏈式作用域的前提

  1)首先要知道js的變數作用域,js的變數作用域就兩種:全域性和區域性
  2)js中當前作用域能訪問其上層作用域的變數和函式

2.js鏈式作用域的定義:

  JS權威指南的描述:
      JavaScript中的函式執行在他們被定義的作用域裡,而不是他們被執行的作用域裡。
      這句話很難理解,但是換做簡單的描述,JS的鏈式作用域就是:
      JS中當遇到對變數名或者函式名的使用時,會首先在當前作用域查詢變數或者函式,如果沒有找到,就會到其上層作用域中尋找,並以此類推。

  下面這個例子在很多博文中引用:

var x = 10;  
  
function test() {  
    alert(x);  
}  
  
test(); 

    上面例子中彈出的值是什麼? 答案是10,這個很好理解,因為上面提到:

  2)js中上層物件中的變數和函式對其子物件都是可見的

  下面對這個例子稍微變換下:

    var x = 10;  
      
    function test() {  
        alert(x);  
        var x = 2;  
    }  
      
    test();  

    改變後的例子彈出的值是什麼?答案是undefined,如果用java等其他程式語言的思維分析很理解,但利用JS鏈式作用域來理解,函式test在執行時,會先在其本身的作用域中尋找,而函式本中是定義了x的,就不會在向上層尋找,但是是定義在alert之後,因此alert會彈出undefined,如果函式內沒有定義x,就像最初的例子,那麼就會在其上層作用域尋找,就是10