是由於,在js中,若是某個變量沒有var聲明,會自動到上一層做用域中去找這個變量的聲明語句,若是找到,就使用,若是沒有找到,繼續向上查找,一直查找到全局做用域爲止,若是全局中仍然沒有這個變量的聲明語句,那麼會自動在全局做用域進行聲明,這個就是js中的做用域鏈閉包
<script> var i = 10; function f1() { //第一層 i = 20; function f2() { //第二層 i = 30; function f3() { //第三層 i = 40; } f3(); } f2(); } f1(); alert(i); //40 </script>
這裏 咱們在每一層函數後面都進行了調用,f3調用,由於f3函數裏面的i沒有使用var聲明,因此,會向上一層f2找,發現也沒有聲明,繼續找f1,而後找到全局變量i,因此,就直接修改了i的值爲40函數
下面是另外一種狀況,當這三層函數中,任意一層中有聲明 ispa
這就是js的做用域鏈。code
局部訪問全局使用做用域鏈 (內部訪問外部的變量就是經過做用域鏈)blog
全局訪問局部能夠使用閉包進行模擬ip