zoukankan      html  css  js  c++  java
  • Javascript中没有块级作用域(模仿)

    在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域)。而在javascript中则没有块级作用域,首先来看一段代码:

    function test(){
                    for(var i = 1 ; i <=5; i++){  //i
                        alert(i);
                    }
                    //alert(i);  //6
                }
                */
                //test();

    对于有块级作用域的语言来说,for语句中定义并初始化的变量i在循环外是无法访问的,而在javascript中,for语句中定义的变量i在循环结束后,依旧会存在于循环外部的执行环境(作用域)中,在这里i的作用域是全局环境。具体来说就是:使用var关键字声明变量时,这个变量会自动添加到距离最近的可用环境中。对于函数而言,这个最近的环境就是函数的局部环境。如果变量在未经声明的情况下被初始化,则该变量会被自动添加到全局环境。

    不过有时候的确很需要块级作用域来解决一些问题,这时候我们就可以使用匿名函数来模仿块级作用域。

    匿名函数就是没有名字的函数,有时候也被称为拉姆达(lamda)函数。形式如下:

    function functionName(arg0,arg1){
        //函数体
    }

    而用作模仿块级作用域(私有作用域)的匿名函数的语法形式如下:

    (function(){
    
        //块级作用域
    
    })();

    以上代码的意思是:首先定义并立即调用一个匿名函数。将函数声明包含在圆括号中,表示它实际上是一个函数表达式。而紧随其后的另一对圆括号表示立即调用这个函数。

    可能刚开始我们感觉这种语法比较难以理解,我们可以先看下下面这段代码:

    var myFunc=function(){
        alert(‘函数’);
    };
    myFunc();

    上面的代码中,首先以函数表达式的方式定义了一个函数,然后立即调用它。在这里定义函数的方式就是先创建一个匿名函数,然后将其赋值给变量myFunc,而在函数名称后加一对圆括号即表示调用函数。那我们如果直接用匿名函数代表变量myFunc,在匿名函数后面添加一对圆括号不就表示直接调用了吗?然而,如果如下这样做就会报错:

    function(){
        //块级作用域
    }();

    因为在javascript中,function关键字表示一个函数声明的开始,而函数声明后面不能直接跟圆括号。而函数表达式后面可以跟圆括号,来表示函数调用。在函数声明外面加一对圆括号就可以转换成函数表达式,如下:

    (function(){
    
        //块级作用域
    
    })();

    这样最简单的块级作用域就创建好了。这种技术长在全局作用域中用在函数外部,来限制向全局作用域中添加过多的变量和函数。例如:

    (function(){    
        var now=new Date();
        if(now.getMonth()==0&&now.getDate()==1){
            alert(“Happy new year”);    
        }
    })();

    以上代码放在全局作用域中,用来确定在1月1日显示一条祝贺新年的信息。其中变量now现在就是匿名函数模仿的块级作用域中的局部变量。

    当然,只要我们临时需要一些变量,都可以使用块级作用域(私有作用域)。当匿名函数执行完毕,其作用域链立即销毁,从而可以减少闭包占用资源问题。

    // js : () 表示执行
                /*
                function test(){
                    (function(){
                        for(var i = 1 ; i <=5; i++){  //i
                            alert(i);
                        }                       
                    })();
                    alert(i);
                }
                test();
                */
    
                //(function(){alert('我直接执行了!');})();

    版权声明:本文为小平果原创文章,转载请注明:http://blog.csdn.net/i10630226

  • 相关阅读:
    UVa OJ 148 Anagram checker (回文构词检测)
    UVa OJ 134 LoglanA Logical Language (Loglan逻辑语言)
    平面内两条线段的位置关系(相交)判定与交点求解
    UVa OJ 130 Roman Roulette (罗马轮盘赌)
    UVa OJ 135 No Rectangles (没有矩形)
    混合函数继承方式构造函数
    html5基础(第一天)
    js中substr,substring,indexOf,lastIndexOf,split等的用法
    css的textindent属性实现段落第一行缩进
    普通的css普通的描边字
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4948239.html
Copyright © 2011-2022 走看看