zoukankan      html  css  js  c++  java
  • 函数自执行,闭包,局部变量,内存回收

    一:函数内变量都是有独立作用域的:1函数外部获取不到内部的变量,2函数执行时浏览器给内部变量分配内存,执行完就会被回收机制回收。
    function foo(c){
        var num = c;
        num++;
        return num;
    }
    foo(5);//6
    foo();//NAN        变量num使用完后就被回收了,所以这次执行num时重新定义的,没有参数所以NAN
    //使用闭包:可使局部变量内存不被回收
    
    function foo(c){
        var num = c;
        return function A(){
            num++;
            return num;
        }
    }
    var b = foo(5);//A
    b();//6                                              foo(5)执行返回的时一个函数赋给b,函数里用到了foo()函数里的变量num,所以这个变量内存不会被回收,
    b();//7                         再次执行b()的时候num是已存在的。
    二:自执行函数节省全局变量,节省内存。
    三:函数闭包为了打通函数内部与外部的桥梁
    比如典型的循环绑定问题
    <ul class="list">
          <li class="bloc">1</li>
          <li class="bloc">2</li>
          <li class="bloc">3</li>
          <li class="bloc">4</li>
          <li class="bloc">5</li>
     </ul>
      var ali = document.querySelectorAll('ul.list li')
    //var声明变量可以穿透作用域
      for(var i = 0,l = ali.length;i < l;i++){
       ali[i].onclick = function(){
            console.log(i)
        }
      }
    //利用自执行函数将每次循环的i值放到了对应的自执行函数里,该函数返回一个函数(闭包),返回的函数里使用了自执行函数里的参数j,该变量j就不会被回收,点击li打印的就是对应的闭包函数里的j值
    for(var i = 0,l = ali.length;i < l;i++){
          ali[i].onclick = (function(j){
              return function(){
                   console.log(j)
              }
          })(i)
     }
     
  • 相关阅读:
    Python (time、datetime、random、os、sys、shutil)模块的使用
    ELK6+filebeat、kafka、zookeeper搭建文档
    JDBC-用Java语句操作数据库
    数据库对象
    sql之子查询
    函数之sql语句
    sql之select语句
    oracle 数据库
    网络编程
    多线程——多线程的运行轨迹,线程的生命周期,线程的常用方法,线程的安全问题,死锁,线程间的通信
  • 原文地址:https://www.cnblogs.com/live-to-talk/p/13554921.html
Copyright © 2011-2022 走看看