我是如何理解JavaScript中的闭包的

236 阅读3分钟

首先 ==》我是通过学习阮一峰先生的代码来看闭包思想的

  • 闭包简单来说,就是为了外部变量读取局部变量
变量访问:
局部变量-------外部变量   ok
外部变量-------局部变量   no

为了解决外部变量访问不了内部变量、变通

变量访问:
局部变量-------外部变量   ok
外部变量-------return 局部变量   ok

将内部变量放在放在一个函数之中,然后return回去,这就是所谓的闭包(没有那么高大上,就是打包后,别人就能用)

  • 闭包的另一个作用,就是保持内部变量在内存中
    闭包变量保存在内存中
    对以上代码的解释
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,
第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除

闭包:另一个理解版本

作用域

javascript 中有全局作用域和局部作用域。局部作用域中可以访问全局作用域中的变量和方法等,但是反过来却不行。我们总结为:以小见大。 下面我们通过一段代码来理解:

var scope="global";//外部变量1
var scope2 = 'winki'//外部变量2
function scopeTest(){
  console.log(scope);//打印出 undefiend
  var scope="local"  
  console.log(scope2)//打印出 winki

}
scopeTest(); //调用方法

从这段简单的代码我们可以看出几个点:

  1. 函数内部变量,先使用,后声明,打印undefined。

  2. 如果函数内部,函数外部有同名变量,由内往外寻找,找到则不再寻找。

  3. 变量声明不加var,默认使用该同名变量为全局变量。

  4. 闭包:闭包的内部函数返回的始终是最后一个值,假如把闭包放在一个循环中,内部函数返回的始终是最后一个值:

(function time(){
for(var i=0,i<5;i++){
  setTimeOut({
      console.log(i)//打印出i
  },1000)
}
})()

打印结果:55

. 从以上我们可以看出几个点:

  1. 函数内部返回的值始终是最后一个。

闭包

概念:

js高程对闭包的定义是:闭包是指有权访问另一个函数作用域中的变量的函数。 创建闭包的常见方式就是在一个函数内部创建另一个函数,作为返回值或参数传递到函数外部。但是根据我的经验,只要在一个函数内部使用了关键字function,一个闭包就被创建了。总而言之:处处都是包,基本所有的js中都必须用到function

例子:

var a = 1;
function test(){//包1
    var b = 2;
    return function(){//包2
        var c = 3
        console.log(a+b+c)
    }
}
var result = test()
result();//6

解释以上代码:包1 是对于全局环境来说的。包2是对于test()函数来说的。

注意点:

  1. 每次调用函数,如果函数中使用闭包,都将创建一个船新的闭包
  2. 闭包放在循环中,闭包中可以使用的变量的值,取决于包含函数的最后一个值。解决方法:让闭包立刻执行。
  3. 闭包容易造成内存泄漏:假如闭包中包含html元素,该元素将不会被销毁。
  4. 闭包容易占用内存:由于闭包携带了它的函数作用域,所以它比普通元素会多占内存