• JavaScript作用域原理——作用域根据函数划分


    一、一个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();
    复制代码

    1、函数在java、C#等语言中,变量i只会在for循环语句中有定义,循环结束,i也就被销毁了。但在JavaScript中,变量i是定义在scope3()活动对象中的,因此在它定义开始,就可以在函数内部访问它。

    2、打印出的i为“10”。

    3、函数scope3等效于下面的代码:

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

    二、私有作用域的匿名函数

    复制代码
         function anonymous() {
                var position = 'in anonymous';
                (function(){
                    for(var i=0; i<10; i++){ 
                   
                    }
                    echo(pscope3, position);//打印显示"in anonymous"
                })();
                //pscope3.innerHTML += i;//报错
            }
            anonymous();
    复制代码

    1、匿名函数可以用来模仿块级作用域,避免上面的那个问题。

    2、在for循环外部插入了一个私有作用域。在匿名函数中定义的任何变量,都会在执行结束时被销毁。

    3、上面的那句注释掉的话,取消注释的话,就会显示错误信息:“ReferenceError: i is not defined”。

    4、作用域的关系大致如下:

    5、position是定义在anonymous函数中的,但可以在匿名函数中打印出来,因为anonymous的作用域包住了匿名函数,在匿名函数中找不到position定义,就往外找。

    三、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();
    复制代码

    1、catch的一个参数ex与capture函数下的局部变量ex同名。

    2、catch中先打印ex,是错误信息,然后赋值为“is catching”,打印出来,但很奇怪,catch外面打印的ex是“in capture”,并不是里面覆盖的值。

    3、position在catch中定义,但是可以在catch的外面打印出来。

    4、window.ex输出的是undefined,也就是说ex不是全局的,因此可以推出catch后面的大括号是普通语句块的性质。

    5、ex的性质可以视为唯一一个把catch语句块当做块作用域的变量,是catch语句块的局部变量。

  • 相关阅读:
    数据处理:并行和性能 狼人:
    GTK+3.0终发布:诸多新特性亮相 狼人:
    微软:Windows 7 SP1将于本月正式发布 狼人:
    程序员的进化 狼人:
    TDD并不是看上去的那么美 狼人:
    Bing API 将新增 Bing 空间数据服务 狼人:
    微软产品组里的十一类人 狼人:
    Windows Phone 7“芒果”更新带来浏览器重大升级:IE Mobile 9 狼人:
    UI前沿技术:XNA颜色滚动程序 狼人:
    传递拷贝php 数组 传递 引用
  • 原文地址:https://www.cnblogs.com/chenliyang/p/6554434.html
Copyright © 2020-2023  润新知