js一

JS三大部分:

EcmaScript(JS核心),

DOM,

BOM

闭包(英文:closure)

1. 闭包是一个函数与作用域环境(即**词法环境**)形成的闭包
2. 闭包的理解:
广义的闭包:1.函数  2.这个函数能访问到函数外部的状态(也称函数外部的变量)
平时理解的闭包:
   特点:函数嵌套函数,并且内部函数通过return返回到外部,外部可以访问内部函数的变量
   
总结:闭包=函数+自由变量

自由变量:即可以是外部的变量,也可是父级函数的形参

闭包特点:

   闭包中自由变量长期驻留内存,长期驻留内存中的变量如果处理不当,会导致内存泄露,不用的话要将闭包置为null
   可以隔离作用域,模拟块级作用域
   

自由变量:就是在函数外部定义的,并且在函数内部可以访问到的变量就叫自由变量
  • 闭包应用举例:

    计数器

    
    //功能:递增,递减,获取递增或递减之后的值
    var Counter=function() {
        //私有变量
        var num=0;
        //私有函数
        var changeValue=function(n) {
    
            return num+=n;
    
        }
    
    
       return {
           //增
           increment:function() {
                changeValue(1)
           },
           //减
           decrement:function() {
                changeValue(-1)
           },
           //获取值
           getValue:function() {
               return num;
           }
       }
    }
    
    

    改变页面字号

    function setSize(size) {
    
       return function() {
    
         document.body.style.fontSize=size+'px'
    
       }
    
    }
    
    var size12=setSize(12);
    
    var size40=setSize(40)
    
    var size50=setSize(50);
    

    定时器累加

    //要求每隔1秒打印1,2,3,.....10
    
      //setTimeout是异步执行的,异步队列
    
    /*
      for(var i=1;i<=10;i++) {
         
         (function(j) {
            setTimeout(function() {
                console.log('i=j的值:',j)
            },2000*j)
         })(i)
    
      }
    
      console.log('最后打印:',i)
    
      */
    
    
       for(let i=1;i<=10;i++) {
        
            setTimeout(function() {
                console.log('i的值:',i)
            },1000*i)
       
    
      }
    

    封装组件:

    立即调用函数
    (function(win,doc) {
    
      //尽情写你的代码啦!
      //私有变量
      
      //私有方法
      
      
      return {
      
      	暴露出去的方法
      
      }
    
    
    
    
    })(window,document)
  • this:

    1.运行时:this它才是真正在运行时的环境为准 ,也就是说this是动态改变的

    2.词法环境:即变量和函数在定义时的环境,即为词法环境

    3.this各种场景大集合:

    a.在全局环境下:this===window===全局
    b.在普通函数内:this === window
    c.在构造函数内:this永远指向当前被实例化的对象
    
     例如:f1,f2
     
      function Fn(name='张三',age=0) {
          this.name=name
          this.age=age
          //指向实现化的对象,分别:this===f1  //true
          console.log('this:',this)
      }
    
     var f1=new Fn('盖威',20)
     var f2=new Fn('姚杰',18)
     
     
    d.在对象中:
    var value='React'
    
       var obj={
           value:'vuejs',
           getValue:function() {
               //this=== obj //true
               
               function getValue2() {
                   console.log('obj内部this:',this.value)  //this === window
               }
    
               getValue2()
    
               return this.value;
           }
       }
    
       obj.getValue()
    
    e.在dom中:
    
       <button class="btn">改变当前按钮背景色</button>
    
    <script>
    var btn=document.querySelector('.btn')
    btn.onclick=function() {
        console.log(this===btn)
        this.style.background='#f00'
    }
    </script>
    f.在定时器中
    
     var value='React'
    
       var obj={
           value:'vuejs',
           getValue:function() {
             var _this=this;
               setTimeout(function() {
                   console.log(this)  //定时器中的this永远指向window
                   console.log(this.value)
               },2000)
           }
       }
    
       obj.getValue()
       
       解决方案:通过保存this或箭头函数或call,apply,bind来实现
    
    

    总结一下:

    this: this并不是指向谁就是谁

     var value='React';
    
       var obj={
           value:'Vuejs',
           getValue:function() {
               console.log(this===window)
               console.log(this.value);
           }
       }
    
      // obj.getValue();   // this===obj
     // console.log((obj.getValue)())   //this===obj
    
     //console.log((obj.getValue=obj.getValue)())  //this===window
     //console.log((false || obj.getValue)())   //this===window
     //console.log((false,obj.getValue)())    //this===window
    

    从JS官方规范来解读,才能解读清楚上面的一切现象!!!!!!!

    ES5中文官方文档:http://yanhaijing.com/es5/#about

原文地址:https://www.cnblogs.com/akby/p/13026366.html