javascript闭包

在讲闭包之前,

提两爪子作用域,在我们js中只存在两种类型的作用域

全局作用域,全局作用域保存着全局对象window,window保存在window里的变量

程序里的所有位置都可以用,另一种就是函数作用域,函数作用域保存着函数内的局部变量

仅可以在当前函数内部访问,外部不可以访问。

而我们外部想访问函数内部的属性这可咋整呢????

感觉还需要提两爪子作用域链:

作用域链就是多级函数作用域形成的链式结构,作用域链的构成给我们的js引擎提供了足够的

位置信息,当我们查找一个所需的变量时,引擎会在作用域链中找到第一个匹配的变量。并且我们

在多层的嵌套作用域可以定义相同的变量,这叫做“遮蔽效应”(即内部的变量遮盖了外部的变量),

抛开遮蔽效应,作用域查找的顺序始终从运行时所处的最内部作用域开始,逐级向外或者向上进行,

直到找到第一个匹配的标识符,到了window还每找到- .-就算了返回个undifined

 

这就到了咱们的重点闭包了。

 

为什么要闭包:

全局对象得优点时可以重用,但是容易被更改。

局部对象恰恰相反,代码不可以重用,但是不能随意访问。

如果当我们程序里,需要一个变量,而又不能被随意篡改时,这个时候我们就需要一种新得概念。

闭包:

首先我们需要用函数包裹着我们得局部变量,还有我们得子函数

 

闭包就是能读取其他函数内部变量的函数,因为在我们传统的js中

 

外部不能访问其函数内部的变量,但是函数内部的子函数是可以访问其内部的局部变量的。

 

可以参考上面的作用域链。

 

使用闭包:(估计只有我一个人看的懂。。

当我们需要从外部引用函数内部得变量时,首先我们把需要得变量放在一个父函数里,

然后定义一个子函数,子函数充当使用者,子函数使用这个变量时会沿着作用域链,找到

父函数得保存得变量。使用之后,父函数将子函数return出去(return 是一个返回值,返回一个结果),

然后在外部添加一个变量接住(这个时候父函数的返回值就是这个函数),所以新变量接住的就是返回出去的子函数,

这样我们直接调用这个变量就是调用那个子函数,子函数因为没有需要的局部变量,用的是父函数的变量,所以始终引用着

父函数导致父函数的作用域无法被释放。父函数被调用了一次始终存在,而子函数每次调用都会释放,可是这不关父函数的事,

父函数的局部变量永远是那一个不会变化,用多少是多少。

画一张图;

 

 这张图完美的诠释了我这种表达能力不行的人 写出来的东西 事倍功半 哎!!!!!