一.做用域:變量或者函數能夠起做用的範圍,變量退出做用域以後會銷燬,全局變量關閉網頁或瀏覽器纔會銷燬。瀏覽器
①全局做用域:在<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