【javascript】作用域和闭包浅析

作用域

    分全局作用域和局部作用域

    全局作用域:函数外部定义的变量,可以被整个program的各成员参照利用。

    局部作用域:函数内部定义的变量,仅供该函数的各成员参照利用。

   var val=1;         //全局变量,全局作用域
   function func(){
       var val1 = 2; //局部变量,局部作用域
   
    }

 

      全局变量的内存在program结束时被销毁回收。

      局部变量的内存在函数调用结束时即被销毁回收。

     

      对作用域存在的意义的总结:

       1,团队开发中,运用局部作用域可以避免同名变量的竞和

       2,作用域不同时,同名的变量的值和意义完全不同

       3,局部变量的内存保持期间是函数的执行期间,一旦函数执行结束,内存即被释放

       4,全局变量的内存保持期间是program的存续期间,program结束,内存即被释放。

       5,如果把只在函数内部利用的变量,定义成全局变量,让其存在于program的整个运行期间,是一种内存浪费。

 

闭包

    闭包的作用就是保持一个局部变量的状态,延长其生存期。

    如何做到这一点呢,闭包存在的前提条件如下:

    ①有函数嵌套

   ②子函数用了父函数的私有变量

    ③该子函数处在父函数的return里边

    这样的话,父函数执行完毕,销毁内存的时候,因为返回的是子函数,子函数里又有对父函数私有变量的引用,该私有变量的内存将不会被销毁,而被保留。

    下面的代码就是一个闭包的例子。val原本是一个局部变量,形成闭包以后,它的值可以一直被保到module这个对象被销毁时。

    function func(){
        var val=1;
        return{
            increment:function (){
                val++;
            },
            show:function (){
                alert(val);
            }
        }
    };

    
    //闭包形成
    var module = func();   //val不会随着func的执行结束而销毁,可以持续到module这个对象被销毁时,延长了val变量的生存期
    module.show();    //val = 1
    module.increment();
    module.show();   //val = 2
 

    从上面的例子可以看出,如果不把函数设定给某个外部变量,闭包将无法形成。

    函数func被赋给了module这个全局变量,那么此时module变量里究竟存了那些东西。

    函数执行时,会自动生成函数对象,该对象包含内容如下,也就说这一串东西都被赋给了module这个全局变量,所以在module的存续期间,val的状态会被一直保持。

//func()执行时生成的函数对象
//{
//      arguments:,
//      this:,
//      m:,函数的参数,如果有的话
//      n:,函数的参数,如果有的话
//      var:,
//      increment:,
//      show:,
//}

 

    闭包可以把局部变量全局化,这算不算一种内存浪费,或者内存泄露呢?

   

 

posted @ 2016-12-27 17:40  懒先生的夫人  阅读(172)  评论(0编辑  收藏  举报