javascript痛点之三闭包

时间:2024-06-10 08:05:49

先来看看第一节的例子

  'use strict';
  function num(){
    //用var声明一个变量num1
     var num1 = 15;
  }
  alert(num1);//num1 is not defined

我们在函数外是访问不了函数内的局部变量!正常的情况下我们是办不到的

但我们这样写试试看!

  'use strict';
  function num(){
    //用var声明一个变量num1
     var num1 = 15;
     return function(){
         return num1;
    }
  }
 var num2 = num();
 var num3 = num2();
 alert(num3);

这样我们就可以取到局部变量了。这就是闭包!

--闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包的优点

闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在f1调用后被自动清除。

//通过闭包可以实现局部变量的累加
    function sum(){
        var age=21;
        return function(){
            age++;
            return age;
        }
    }
     var my_age=sum();
     alert(my_age());
     alert(my_age());
     alert(my_age());
  由于闭包里作用返回的局部变量资源不会被回收,所以可能会用更 多的内存。过度使用闭包会性能下,建议在非常有必要的时才使用闭包。
一些建议:学习变量前请先学习作用域和执行环境的概念(在第一节有说道)

另外看到过这样的回答:

闭包:在爷爷的环境中执行了爸爸,爸爸中返回了孙子,本来爸爸被执行完了,爸爸的环境应该被清除掉,但是孙子引用了爸爸的环境,导致爸爸释放不了。
这一坨就是闭包。
简单来讲,闭包就是一个引用了父环境的对象,并且从父环境中返回到更高层的环境中的一个对象。

希望对你理解闭包有帮助吧!

(完