js作用域問題一步步透徹理解


黃金守則第一條:

    js沒有塊級作用域(你可以自己閉包或其他方法實現),只有函數級作用域,函數外面的變量函數里面可以找到,函數里面的變量外面找不到。

   first try:

  

  這是為什么呢??

 

 1 var a = 10;
 2         function aaa(){//step-4
 3             alert(a);//step-5->執行alert,此時只能找到外面的a=10故彈框10
 4         }
 5         function bbb(){//step-2
 6             var a = 20;
 7             aaa();//step-3
 8         }
 9         //定義了函數沒啥用,調用才是真格的所以這里是step-1
10         bbb();//step-1

 

其實原理大家都懂,應該就是易錯而已,萬變不離其綜。

 

 second try:

這是為什么呢? (感謝大家的留言)

var a=b=10這種寫法在函數內,b其實是全局變量,a當然是局部變量
執行完aaa(),在全局域里alert(a),當然是undefined,alert(b),就會彈出10

 

黃金守則第二條:

   變量的查找是就近原則,去尋找var定義的變量,當就近沒有找到的時候就去查找外層。

look:

  

 

這是為什么呢、? 這里面有兩個原因,一是預解析,二是就近查找。

 

 1         var a=10;
 2         function aaa(){
 3             alert(a);//undefined,查找a的時候會現在函數內查找,由於預解析的作用,此時的a是undefined,因此永遠不會去查找外面的10了
 4             var a = 20;
 5 
 6             /*預解析
 7             var a
 8             alert(a);
 9             var a = 20;*/
10 
11         }
12         aaa();

 

attention:

 

這個吧,就驗證了第二條,雖然是就近原則,但是是就近找var聲明的變量,這個是因為沒有var聲明的變量是全局的,這里只是修改了a的值。所以上面就是因為在函數內沒找到var的a,於是到外面去找了,一找就找到了,於是a就alert出10了;不過沒錯的是a=20后,a確實為20了,只不過alert的時候還沒有執行到那~~

看吧~

 

下面這個例子,更加驗證了js的函數作用域 而已:

這是因為在alert(a)的時候,bbb函數中的a確實為20 ,可是它對於這時的alert(a)這句話來說是局部的,alert(a)根本找不到bbb函數中的a,所以在aaa函數中它找不到a,於是乎去外面找,一找,就找到了10。

 

 

黃金守則第三條:

    當參數跟局部變量重名時,優先級是等同的。

 

例:

 

 還有:傳參時,基本類型傳值,引用類型傳引用。(但是重新賦值之后就不是這樣了喔)

1         var a = 5;
2         var b = a;
3         b +=3;
4         alert(a);//5
5 
6         var a = [1,2,3];
7         var b=a;
8         b.push(4);
9         alert(a);//[1,2,3,4];

上面代碼沒有問題,但是下面就不一樣啦。

 

 

因為b被重新賦值了,不指向a了。

 

此外,參數與變量的作用域是相似的:

對比上下這兩個:

上面是參數是基本類型,只傳了值進去,下面的傳個引用類型:(同樣也包含重新賦值的情況)

 

這里再貼個關於數組的比較有趣的:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM