• 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

  • 相关阅读:
    vue登录注册及token验证
    react实现登录注册
    React Native仿京东客户端实现(首页 分类 发现 购物车 我的)五个Tab导航页面
    进度条效果
    手风琴切换效果
    React实现了一个鼠标移入的菜单栏效果
    react购物车
    react实现tab切换效果
    网络缓存
    java线程面试手写题
  • 原文地址:https://www.cnblogs.com/akby/p/13026366.html
Copyright © 2020-2023  润新知