zoukankan      html  css  js  c++  java
  • JavaScript:什么是闭包?

    Js代码  收藏代码
    1. function outerFun()  
    2.     {  
    3.         var a=0;  
    4.         function innerFun()  
    5.         {  
    6.             a++;  
    7.             alert(a);  
    8.         }                 
    9.     }  
    10. innerFun()  



    上面的代码是错错误的.innerFun()的作用域在outerFun()内部,所在outerFun()外部调用它是错误的. 

    改成如下,也就是闭包: 

    Js代码  收藏代码
    1. function outerFun()  
    2. {  
    3.     var a=0;  
    4.     function innerFun()  
    5.     {  
    6.         a++;  
    7.         alert(a);  
    8.     }  
    9.     return innerFun;  //注意这里  
    10. }  
    11. var obj=outerFun();  
    12. obj();  //结果为1  
    13. obj();  //结果为2  
    14. var obj2=outerFun();  
    15. obj2();  //结果为1  
    16. obj2();  //结果为2  


    什么是闭包: 

    当内部函数 在定义它的作用域 的外部 被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被 释放,因为闭包需要它们. 

    -------------------------------------------------------------------------------------------------------- 

    再来看一个例子 

    Js代码  收藏代码
    1. function outerFun()  
    2. {  
    3.     var a =0;  
    4.     alert(a);         
    5. }  
    6. var a=4;  
    7. outerFun();  
    8. alert(a);  



    结果是 0,4 .  因为在函数内部使用了var关键字 维护a的作用域在outFun()内部. 

    再看下面的代码: 

    Js代码  收藏代码
    1. function outerFun()  
    2. {  
    3.     //没有var   
    4.     a =0;  
    5.     alert(a);         
    6. }  
    7. var a=4;  
    8. outerFun();  
    9. alert(a);  


    结果为 0,0 真是奇怪,为什么呢? 

    作用域链是描述一种路径的术语,沿着该路径可以确定变量的值 .当执行a=0时,因为没有使用var关键字,因此赋值操作会沿着作用域链到var a=4;  并改变其值.

  • 相关阅读:
    基于jQuery和Bootstrap的手风琴垂直菜单
    JavaScript右下角信息提示插件Notyf
    强大的jQuery幻灯片播放插件 支持全拼、拖拽和下载等功能
    较常用的Math方法及ES6中的扩展
    ES6 完全使用手册
    如何用纯 CSS 创作一个小球上台阶的动画
    BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树
    BZOJ_2815_[ZJOI2012]灾难 倍增lca + 构造
    BZOJ_3316_JC loves Mkk_ 二分答案 + 单调队列
    BZOJ_1260_[CQOI2007]涂色paint _区间DP
  • 原文地址:https://www.cnblogs.com/architects/p/4255827.html
Copyright © 2011-2022 走看看