Javascript中做用域就是變量與函數的可訪問範圍
,即做用域控制着變量與函數的可見性和生命週期。變量的做用域有全局做用域和局部做用域兩種。當查找變量的時候,會先從當前上下文的變量對象中查找,若是沒有找到,就會從父級執行上下文的變量對象中查找,一直找到全局上下文的變量對象,也就是全局對象。這樣由多個執行上下文的變量對象構成的鏈表就叫作做用域鏈。函數
看幾個題目:spa
A :code
1 var a = 1 2 function fn1(){ 3 function fn2(){ 4 console.log(a) 5 } 6 function fn3(){ 7 var a = 4 8 fn2() 9 } 10 var a = 2 11 return fn3 12 } 13 var fn = fn1() 14 fn() //輸出多少
觀察代碼,咱們發如今這裏 fn() 的結果最終由 function fn2(){console.log(a)} 決定,執行fn2,但在其中沒有聲明a,因而在其上一級做用域中尋找,發現存在局部變量 var a = 2 ,因而執行第4行 console.log(a) ,最終輸出爲 2 。對象
B:blog
1 var a = 1 2 function fn1(){ 3 function fn3(){ 4 var a = 4 5 fn2() 6 } 7 var a = 2 8 return fn3 9 } 10 function fn2(){ 11 console.log(a) 12 } 13 var fn = fn1() 14 fn() //輸出多少
觀察代碼,咱們發如今這裏fn() 的結果最終由 function fn2(){console.log(a)} 決定,執行fn2,但在其中沒有聲明a,因而在其上一級做用域中尋找,發現存在全局變量 var a = 1,因而最終結果輸出爲1 。生命週期
C:ip
1 var a = 1 2 function fn1(){ 3 4 function fn3(){ 5 function fn2(){ 6 console.log(a) 7 } 8 var a 9 10 fn2() 11 a = 4 12 } 13 var a = 2 14 return fn3 15 } 16 var fn = fn1() 17 fn() //輸出多少
觀察代碼,咱們發如今這裏fn() 的結果最終由fn2()決定,在fn3()中fn2()在執行的時候,其內部並無聲明變量a,因而向上一級做用域找,找到局部變量a,它雖已聲明但尚未賦值(賦值在其後),因此最終輸出爲 undefined 。作用域
小結一下:博客
簡單先寫到這裏吧,有不當之處歡迎批評指正。io
我的博客,引用請註明出處。