JavaScript做用域原理(三)——做用域根據函數劃分

1、一個for實例

<p id="scope3" style="color:red"></p>
     var pscope3 = document.getElementById('scope3');
        function scope3() {
            for(var i=0; i<10; i++){ 
               
            }
            echo(pscope3,  i);
        }
        scope3();

一、函數在java、C#等語言中,變量i只會在for循環語句中有定義,循環結束,i也就被銷燬了。但在JavaScript中,變量i是定義在scope3()活動對象中的,所以在它定義開始,就能夠在函數內部訪問它。javascript

二、打印出的i爲「10」。html

三、函數scope3等效於下面的代碼:java

     function scope3() {
            var i;
            for(i=0; i<10; i++){ 
               
            }
            echo(pscope3,  i);
        }        

 

2、私有做用域的匿名函數

     function anonymous() {
            var position = 'in anonymous';
            (function(){
                for(var i=0; i<10; i++){ 
               
                }
                echo(pscope3, position);//打印顯示"in anonymous"
            })();
            //pscope3.innerHTML += i;//報錯
        }
        anonymous();

一、匿名函數能夠用來模仿塊級做用域,避免上面的那個問題。web

二、在for循環外部插入了一個私有做用域。在匿名函數中定義的任何變量,都會在執行結束時被銷燬。ruby

三、上面的那句註釋掉的話,取消註釋的話,就會顯示錯誤信息:「ReferenceError: i is not defined」。函數

四、做用域的關係大體以下:spa

五、position是定義在anonymous函數中的,但能夠在匿名函數中打印出來,由於anonymous的做用域包住了匿名函數,在匿名函數中找不到position定義,就往外找。.net

 

3、try語句catch部分的特殊狀況

     function capture() {
            var ex = 'in capture';
            try{  
                i;
            }catch(ex){
                var position= 'in catch';
                echo(pscope3, ex); //ReferenceError: i is not defined
                var ex = 'is catching';
                echo(pscope3, position);//in catch
                echo(pscope3, ex);//is catching
            }
            echo(pscope3, position);//in catch
            echo(pscope3, ex); //in capture 不是catch中賦的值
            echo(pscope3, window.ex); //undefined
        }
        capture();

一、catch的一個參數ex與capture函數下的局部變量ex同名。code

二、catch中先打印ex,是錯誤信息,而後賦值爲「is catching」,打印出來,但很奇怪,catch外面打印的ex是「in capture」,並非裏面覆蓋的值。htm

三、position在catch中定義,可是能夠在catch的外面打印出來。

四、window.ex輸出的是undefined,也就是說ex不是全局的,所以能夠推出catch後面的大括號是普通語句塊的性質。

五、ex的性質能夠視爲惟一一個把catch語句塊當作塊做用域的變量,是catch語句塊的局部變量。

 

 

 

demo下載:

http://download.csdn.net/detail/loneleaf1/7983577

 

參考資料:

http://www.laruence.com/2009/05/28/863.html Javascript做用域原理

http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html JavaScript 開發進階:理解 JavaScript 做用域和做用域鏈

http://www.cnblogs.com/zxj159/archive/2013/05/30/3107923.html Javascript之匿名函數(模仿塊級做用域)

http://www.web-tinker.com/article/20331.html try-catch語句的「僞塊做用域」

http://msdn.microsoft.com/zh-cn/library/bzt2dkta%28v=vs.94%29.aspx 變量做用域 (JavaScript)

http://www.cnblogs.com/rubylouvre/archive/2009/08/21/1551270.html javascript變量的做用域

http://www.nowamagic.net/librarys/veda/detail/896 深刻淺出JavaScript變量做用域

http://www.web-tinker.com/article/20331.html try-catch語句的「僞塊做用域」

相關文章
相關標籤/搜索