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语句的“伪块做用域”

相关文章
相关标签/搜索