JavaScript:做用域和做用域鏈

一.做用域:變量或者函數能夠起做用的範圍,變量退出做用域以後會銷燬,全局變量關閉網頁或瀏覽器纔會銷燬。瀏覽器

①全局做用域:在<script>或者一個獨立的js文件中,全局做用域中定義的變量是全局變量。在任何位置均可以訪問。函數

1 var num = 15;//全局變量
2 function fn() {
3   str = 'qaq';// 這裏不用var聲明也是全局變量(不規範)
4   console.log(num);
5   console.log(str);
6 }
7 fn();//15 qaq
8 console.log(str);//qaq

②局部做用域:一個函數有一個局部做用域,局部做用域中定義的變量是局部變量。局部變量只能夠在定義此變量的函數裏訪問。spa

1 function fn() {    
2   var num = 15;// 局部變量
3 }    
4 console.log(num);// num is not defined

③塊級做用域:ES5前沒有,一對花括號({和})中的語句集都屬於一個塊。塊外不能訪問塊內變量。code

1 {
2   // 代碼塊
3   var num = 15;
4   console.log(num);//15
5 }
6 console.log(num);//num is not defined

二.做用域鏈: 函數內指向函數外的鏈式結構叫作做用域鏈。blog

 1 // 全局做用域 --- 0級做用域鏈
 2 var num = 5;
 3 function f1() {
 4   // f1 局部做用域 --- 1級做用域鏈
 5   var num = 15;
 6   function f2() { 
 7     // f2 局部做用域 --- 2級做用域鏈
 8     console.log(num);
 9   }
10   f2();//步驟2:函數f1裏定義局部變量num和函數f2,而後調用f2
11 }
12 f1();//步驟1:全局做用域下定義變量num和函數f1,而後調用f1
13 //步驟3:f2打印num,可是在f2裏沒有找到num,因而往上一級找,找到了num是15,打印。
14 //若是將f1裏的num等於15註釋掉,那麼會繼續往上找,找到全局做用域的num,那麼打印結果是5

相關文章
相關標籤/搜索