zoukankan      html  css  js  c++  java
  • 关于闭包

    全局变量和局部变量

    1  var a=1;     //全局变量
    2   function fun() {
    3     var a=2;    //局部变量
    4     b=1;        //全局变量
    5     alert(a);   //2
    6   }
    7   alert(a);     //1
    8   alert(b);     //1
    JS中函数内是可以直接读取全局变量,而函数外部是无法读取函数内的局部变量的

    闭包

      闭包就是能读取另一个函数内部变量的函数,可以简单的理解为定义在一个函数内部的函数
      本质上,闭包就是将函数内部和函数外部链接起来的一座桥梁
     1 function f1(){
     2   var n=1;
     3   function f2(){
     4     alert(n);
     5   }
     6   return f2;
     7 }
     8 //alert(n);
     9 var result=f1();
    10 result();     //  1
    js语言的“链式作用域”,子对象会一级一级的向上寻找所有父对象的变量,所以,父对象的所有变量对子对象都是可见的。因为f2可以读取f1中的局部变量,所以只要把f2作为返回值就可以在f1外部读取它的内部变量。

    闭包的用途

      1、读取函数内部的变量
      2、让这些变量的值始终保持在内存中
     1 function f1(){
     2   var n=1;
     3   Add=function(){
     4     n+=1;
     5   };
     6   function f2(){
     7     alert(n);
     8   }
     9   return f2;
    10 }
    11 //alert(n);
    12 var result=f1();
    13 result();      // 1
    14 Add();
    15 result(); // 2

      

    result实际就是闭包函数f2,一共被执行了两次。第一次是1,第二次是2 。这说明局部变量n一直都在内存里,因为f1是f2的父函数,f2被赋值给一个全局变量,这导致f2始终都在内存中,而f2的存在依赖f1,因此f1也始终都在内存中。

    问题

      1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗会很大,所以不能滥用闭包,否则会造成网页的性能问题,在退出函数之前将不使用的局部变量全部删除。
      2、闭包会在父函数外部改变父函数内部变量的值,所以如果把父函数当做对象来使用,把闭包当做它的公用方法,把内部变量当作它的私有属相,这时不能随便改变父函数内变量的值。

  • 相关阅读:
    【转】Mybatis常见面试题总结
    【转】深入分析@Transactional的用法
    刷抖音极速版,大家一起来赚钱
    公司喜欢什么样的员工呢?
    边学习新技术边工作的重要性
    聊聊IT行业加班的问题
    软件工程师怎样减轻工作过程中遇到的压力
    如何找兼职工作
    常用的网址导航
    几家主要的配送(跑腿)服务提供商
  • 原文地址:https://www.cnblogs.com/aizz/p/9277506.html
Copyright © 2011-2022 走看看