zoukankan      html  css  js  c++  java
  • 闭包

    /*闭包
    要理解闭包,首先必须理解js特殊的变量作用域。变量的作用域无非就是两种,全局与局部变量
    且函数内部可以直接读取到全局变量
    * */

    var n=999;
    function f1() {
    alert(n);
    }
    f1();//99
    //在函数外部自然无法读取函数内的局部变量
    function f2(){
    var a=8; //函数内部声明变量的时候,一定要使用var命令,否则实际上声明了一个全局变量
    }
    // alert(a)//defined

    //如何从外部读取局部变量,由于各种原因,我们有时候需要得到函数内部的局部变量,但是前面已经说过,正常情况下是取不到的,只有通过变通方法才能实现 那就是在函数的内部,在定义一个函数

    function fn(){
    var n=999;
    function fn2(){
    alert(n);//99
    }
    }
    //在上面代码中,函数fn2就被包括在函数fn内部,这时fn内部的所有局部变量对fn2都是可见的,但是返过来就不行,fn2内部的局部变量,对fn就是不可见的,这就是js语言特有的链式作用域结构,子对象会一级一级的向上寻找所有父对象的变量,所以,父对象的所有变量,对子对象都是可见的,反之则不成立 既然fn2可以读取fn的局部变量,那么只要把fn2作为返回值,我们不就可以在f1外部读取它的内部变量了吗


    function fn3(){
    var n=666;
    function fn4(){
    alert(n);
    }
    return fn4;
    }
    var result = fn3();
    result();//666

    //闭包概念 上边代码中的fn4函数就是闭包 ,闭包就是能够读取其他函数内部变量的函数 , 在js语言中,只有函数内部才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数” 本质上说闭包其实就是将函数内部和函数外部连接起来的一座桥梁

    //闭包的用途 闭包可以用在很多地方,他的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中
    function fnn(){
    var n=999;
    nAdd=function(){
    n+=1;
    }
    function fnn2(){
    alert(n);
    }
    return fnn2;
    }

    var result=fnn();
    result();//999

    nAdd();
    result();//1000

  • 相关阅读:
    Mybatis中selectKey源码分析
    Mybatis 基于注解Mapper源码分析
    MyBatis的二级缓存以及装饰器模式运用
    ConcurrentSkipListMap源码分析
    CopyOnWriteArrayList源码分析
    InnoDB 单列索引与多列索引
    Java 线程池源码分析
    JDK8 ReentrantReadWriteLock源码分析
    关于lombok的坑
    on duplicate key update 的用法说明(解决批量操作数据,有就更新,没有就新增)mybatis批量操作数据更新和添加
  • 原文地址:https://www.cnblogs.com/h5it/p/9274435.html
Copyright © 2011-2022 走看看