关于闭包学习的一些个人感想

        闭包,在网上翻阅了很多资料,并没有一个非常明确的定义,但是,有几个非常明显的特征。

        第一,函数作为返回值;第二,函数作为参数传递。

        函数作为返回值时,可以将其赋值给一个变量,从而调用父函数中的局部变量。

var n=100;
function test1(){
    var n=10;

    function test2(){
      console.log(n); 
    }
  }

        在上述代码中alert出来的n的值就是10而不是全局变量中的100,并且在外界也无法调用test1中的n的值。

        在函数作为参数进行传递的时候有一个很重要的部分,就是作用域的问题,这里有两个很重要的概念,第一个是“自由变量”,另一个是“作用域链”。首先我们来看一个例子;

var x=10;
function test1(){
    console.log(x);
}

function test2(f){
    var x=20;
    (
    function(){
        f();
    }
    )();
}

test2(test1);

        在上述代码中最后test2中x就是一个自由变量,取的值是实际上是10,并不是其父作用域中的20,其原理是这样的,要到创建这个函数的作用域中去取值,重点在于“创建”,而不是“调用”,这一点非常重要。

        如果还是没能找到,那就需要继续跨域,直到全局作用域,而这个跨域寻找的层级,我们就称为“作用域链”。

        在当前作用域查找,如果没有,判断是否是全局作用域,如果是全局,则表示确实没有,如果是函数作用域则将创建该函数的作用域当做当前作用域,返回开头继续直到找到或者在全局作用域中也找不到。

        在通常情况下,一个函数执行完成后,其上下文环境会被内存销毁收回,其中的变量也一同销毁。而在闭包的情况下,父函数的作用域则不会被销毁,父函数的局部变量也不会被销毁,所以在方便使用的同时,闭包结构也明显的会为系统的内存增加负担,这也是闭包最最明显的一个弊端,所以我们在不需要的时候一定不要去强行使用闭包,减轻开销,降低系统压力。

猜你喜欢

转载自blog.csdn.net/a672845190/article/details/81102903