登录
注册
node.js 学习社区
简单理解 javascript 闭包的概念

桌椅童鞋

2015-01-27 16:20

根据作用域链的规定,JS的内部函数可以访问到它所在的外部函数中的变量和参数,当这个内部函数在包含它的外部函数之外的地方被调用时,就会形成“闭包”

“闭包” 可以理解为 一个函数访问到了另一个函数作用域里的变量的过程。但是因为JS函数作用域的规定,普通的两个函数是无法访问对方作用域内的变量的。

先看下面代码:
var a=1;
function func1(){
    var b=2;
    console.log(a);
    console.log(b); 
}
func1();
//输出结果
// 1
// 2  内部可以访问到全局变量

function func2(){
    console.log(a);
    console.log(b); 
}
func2();
//输出结果
// 1
// undefined   无法访问其他函数作用域的变量 

所以,为了访问到对方的作用域,必须想一些办法。先说一下javascript 作用域链的概念,执行环境 先调用自己所在作用域内的变量和参数,然后调用该作用域所在的外层作用域的变量和参数…… 直到顶层的全局作用域内的变量,形成了一个作用域链。存在于该作用域链内的任何变量,执行环境此时都可以访问到。根据上面这种特性,我们就可以得到一个 访问其他函数作用域内变量的方法。

再看下面代码:

function func3(){
   var c=3;
   return function(){ /* 内部函数  */
      console.log(a);
      console.log(c);
   }
}
var func4=func3();
func4();
//输出结果
// 1
// 3 
从表面上看,func4 的确访问到了func3作用域内的变量c。 于是我们就可以称 func4访问变量c这个过程为闭包。此时fun3和func4在同一级作用域。正常情况下func3执行结束后,内部的变量就会被垃圾回收释放,但是由于垃圾回收时发现它的变量c 还存在func4的作用域链里面,所以不会立刻释放内存,这一点容易导致内存泄露。

回复 · 1

发表回复

你可以在回复中 @ 其他人