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

  • 相关阅读:
    计算机重要算法
    文明能压碎,情怀不衰,无论枯干山水
    【首先膜拜大湿】poj-2386-Lake Counting-DFS模板题
    图论待做题
    HUD-1142
    课后作业第二篇
    课后作业第一篇
    linux安装tomcat(转载:http://blog.csdn.net/zhuihunmiling/article/details/8977387)
    log4j 日志的初始化
    用Wget进行下载
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4948239.html
Copyright © 2011-2022 走看看