【js】 js 闭包

闭包是什么?闭包是Closure,这是静态语言所不具有的一个新特性。但是闭包也不是什么复杂到不可理解的东西,简而言之,闭包就是:

  • 闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。
  • 闭包就是就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配
  • 当在一个函数内定义另外一个函数就会产生闭包

一.变量的作用域

 var s = '34';
console.info(
'1----------------'); function test1(){ var i = 3; m = 10; console.info(s+m*i);//3430 } // console.info(m);// m 或者i 提示 未定义 console.info('2------------'); test1(); /* * 执行函数后m变为全局变量 * */ console.info('3-------------'); // console.info(i);// i 未定义 console.info('m的值为:'+m); // 10

上边是普通的函数,定义变量时没有特殊需要都加上var,否则就声明为全局变量。区分变量的作用域为局部变量或者全局变量。

二、获取函数内部的局部变量

 function test2(){

            var n = 10;

            function t(){

               // console.info('局部变量n='+n);
                 return n ;
            }

          return  t();
        }
        var s = test2();
       console.info(s);

三、javascript 闭包的用途(js闭包的用途

闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

  /**
         * js 闭包的用途
         */
        function test3(){

            var b = 99 ;

           tt= function(){
               b++;
                console.info('b变量的值:'+b);
            }

            function ft(){
                   return b;
            }

            return ft();

        }

      var r =  test3();
        console.info(r);//99
        tt();
       r=  test3();
        console.info(r);//99 不应该是100的吗??

最后的r难道不应该是100??结果全是99.不解呀.....

四、使用闭包的注意点

1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

另外看到两个比较有代表性的例子:

 var name = "The Window";
          var object = {
            name : "My Object",
            getNameFunc : function(){

              return function(){
                        return this.name;
      };
    }
          };
           alert(object.getNameFunc()());// The Window
      
        
        

        var name = "The Window";
          var object = {
            name : "My Object",
            getNameFunc : function(){
              var that = this;
      return function(){
                        return that.name;
      };
    }
          };
          alert(object.getNameFunc()());// My Object

参考资料:

学习Javascript闭包(Closure)

JavaScript 里的闭包是什么?应用场景有哪些?

闭包

理解Javascript的闭包

 

posted @ 2015-04-11 19:17  snow__wolf  阅读(156)  评论(0)    收藏  举报