做用域鏈:
1級:查看當前做用域,若是當前做用域聲明瞭這個變量,就肯定結果
2級:查找當前做用域的上級做用域,也就是當前函數的上級函數,看看上級函數中有沒有聲明
3級:再查找上級函數的上級函數,直到全局做用域爲止
若是沒有找到,認爲這個變量未聲明javascript
<script type="text/javascript"> var dog = 1; //全局 function rainman(){ //2級 var man = 2; function inner(){ //1級 var innerVar = 4; alert(dog); } inner(); //調用inner函數 } rainman(); //調用rainman函數 </script>
解釋: alert(rain);
==>inner() //咱們會在inner 這個函數查找是否聲明瞭變量,若是沒有找到,java
咱們查找當前做用域的上級做用域,函數
也就是當前函數的上級函數rainman函數
==>rainman() //rainman函數體內沒有定義dog變量,再查找上級函數的上級函數,spa
直到全局做用域爲止,在全局對象中咱們定義了dog = 1,對象
所以最終結果會彈出'1'。
==>全局做用域blog