js 老生常谈的(闭包)

前言
你可以在一个函数里面嵌套另外一个函数。嵌套(内部)函数对其容器(外部)函数是私有的。它自身也形成了一个闭包。一个闭包是一个可以自己拥有独立的环境与变量的的表达式(通常是函数,因为ES6有了块级作用域的概念)。

初识闭包:

什么是闭包?闭包有什么作用?这是我遇到闭包时的第一反应。
闭包在JavaScript高级程序设计(第3版)中是这样描述:闭包是指有权访问另一个函数作用域中的变量的函数,那么闭包的作用也就很明显了。
1. 可以在函数的外部访问到函数内部的局部变量。 
2. 让这些变量始终保存在内存中,不会随着函数的结束而自动销毁。


在上面的代码中,闭包指的就是function () {return counter += 1;}这个函数。首先解释一下这段代码,在变量add被赋值之前,
第一个function执行了一次(执行且仅会执行一次),因为这是一个函数表达式声明方式并且声明后加上了(),所以会自动执行一次。
执行后add被赋值(匿名函数)了,add= function () {return counter += 1;} 。然后每次调用add()函数时,返回的都是这个函数,
因为这个函数在第一个函数的内部,所以即使第一个函数执行完了,第二个函数依然能访问counter(JS设计的作用域链,当前作用域能访问上级的作用域)。


闭包是可以在另一个函数的外部访问到其作用域中的变量的函数。而被访问的变量可以和函数一同存在。即使另一个函数已经运行结束,导致创建变量的环境销毁,
也依然会存在,直到访问变量的那个函数被销毁。当然,如果仅仅是做一个简单的计数器,大可不用这样麻烦。下面这简短的代码就能轻松实现

var a = 0;
function myFunction(){
a++;
 document.getElementById("demo").innerHTML = a;
}

js闭包 (私有化)

       var  init=(function(){
 	      var  a=100;
 	        function w(){
 	         console.log(a+=1)
 	          };
           function e(){
               console.log(a+=1)
           };
          return function(){
  		w();   //101
  		e();    //102
   	       } 	
        }());

        init();


  模块化闭包


     var myObji=(function(){
       var models={};
       function define(name,deps,impl){
            for(var i=0;i<deps.length;i++){
            deps[i]=models[deps[i]]
          }
          models[name]=impl.apply(impl,deps)
        }
       function get(name){
           return models[name]
        } 
         return{
           define:define,
           get:get
         }
      })()

      myObji.define("bar",[],function(){
         function hello(who){
             return "我是"+who; 
         }
        return {
           hello:hello
          }
        })
       var bar=myObji.get("bar")
       bar.hello("haha")    //我是haha



    上面代码看不懂 看下面

          var modules=(function(){
             var obj={};
             function def(name,fun){
                   obj[name]=fun()
             }  
          //查询{}里面的属性
            function get(name){
                 return obj[name]
              }
             return{
                   def:def,
                   get:get 
               }
          }())

        modules.def("z",function(){
            function hello(){
                 return "哈哈我是闭包"
            }
            return {
                hello:hello
            }
        })

         var f=modules.get("z");
         f.hello()
posted @ 2019-12-28 16:36  蔺雨轩  阅读(156)  评论(0)    收藏  举报