JavaScript闭包,以及使用的场景

  阮一峰说闭包:“我的理解是,闭包就是能够读取其他函数内部变量的函数。”;

  官方解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分;

  朴实直观解释是:A函数中嵌套着B函数,B程序中有用到A的变量,当外部函数C调用函数A时,虽然A已经执行完毕,理论上函数执行完毕,它就要被弹出栈,但是由于B要用到A,所以A的变量被保存到内存中不被销毁,我们称函数B是闭包。

  使用场景:

  1. 采用函数引用方式的setTimeout调用        funcion acc(){ this.time = setTimeout(funtion(){},500) }()
  2. 小范围代替全局变量                                 一个函数里声明了一个变量,函数之前嵌套使用, 函数外无法访问内部变量(可以防止污染其他变量)

    在《js高级程序设计中》,有段代码:

    (function A(){

    var  array1=[];

    for(var i=0;i<5;i++){
    array1[i]=function (){

    return i;   (闭包产生的地方

    }}

    for(j=0;j<5;j++){

    console.log(  array1 [j] ());}

    })()   //5 5 5 5 5 
    如何产生 1.2.3.4.5 的打印值呢,去掉闭包就行(内部函数不要使用外部外部变量)

    (function A(){

    var  array1=[];

    for(var i=0;i<5;i++){
    array1[i]=function(num){

    return function(){
    return num;}}(i);

    }

    for(var j=0;j<5;j++){

    console.log(array1[j]());

    }})() //  0 1 2 3 4   立即调用函数 
    function foo() {/*...*/}  // 这是定义,Declaration;定义只是让解释器知道其存在,但是不会运行。 foo(); // 这是语句,Statement;解释器遇到语句是会运行它的。 
    function foo() {/*...*/}() 相当于   foo()   是一个IIFE立即执行函数   去除闭包的一个有效方法

    (function(){}())与(function(){})()

    这两种写法,都是一种立即执行函数的写法,即IIFE (Immediately Invoked Function Expression)。这种函数在函数定义的地方就直接执行了。

  3. 访问私有变量的特权方法                         通过构造函数创建对象 (使用this关键字,或者var声明一个变量)

    var obj = function (){

    this.name ='张三';

    this.age = 19;   //var age = 19


    this.getAge = function (){
    return this.age;  // age
    };
    this.setAge = function(value){
    this.age = value;  // age = value
    };

    };
    var person = new obj()

    console.log(person.getAge())  // 19
    console.log(person.setAge(50))

     console.log(person.getAge())    // 50   

posted @ 2020-10-23 13:06  山哥(狄某人)  阅读(105)  评论(0)    收藏  举报