javascript闭包
在讲闭包之前,
提两爪子作用域,在我们js中只存在两种类型的作用域
即全局作用域,全局作用域保存着全局对象window,window保存在window里的变量
程序里的所有位置都可以用,另一种就是函数作用域,函数作用域保存着函数内的局部变量
仅可以在当前函数内部访问,外部不可以访问。
而我们外部想访问函数内部的属性这可咋整呢????
感觉还需要提两爪子作用域链:
作用域链就是多级函数作用域形成的链式结构,作用域链的构成给我们的js引擎提供了足够的
位置信息,当我们查找一个所需的变量时,引擎会在作用域链中找到第一个匹配的变量。并且我们
在多层的嵌套作用域可以定义相同的变量,这叫做“遮蔽效应”(即内部的变量遮盖了外部的变量),
抛开遮蔽效应,作用域查找的顺序始终从运行时所处的最内部作用域开始,逐级向外或者向上进行,
直到找到第一个匹配的标识符,到了window还每找到- .-就算了返回个undifined
这就到了咱们的重点闭包了。
为什么要闭包:
全局对象得优点时可以重用,但是容易被更改。
局部对象恰恰相反,代码不可以重用,但是不能随意访问。
如果当我们程序里,需要一个变量,而又不能被随意篡改时,这个时候我们就需要一种新得概念。
闭包:
首先我们需要用函数包裹着我们得局部变量,还有我们得子函数
闭包就是能读取其他函数内部变量的函数,因为在我们传统的js中
外部不能访问其函数内部的变量,但是函数内部的子函数是可以访问其内部的局部变量的。
可以参考上面的作用域链。
使用闭包:(估计只有我一个人看的懂。。)
当我们需要从外部引用函数内部得变量时,首先我们把需要得变量放在一个父函数里,
然后定义一个子函数,子函数充当使用者,子函数使用这个变量时会沿着作用域链,找到
父函数得保存得变量。使用之后,父函数将子函数return出去(return 是一个返回值,返回一个结果),
然后在外部添加一个变量接住(这个时候父函数的返回值就是这个函数),所以新变量接住的就是返回出去的子函数,
这样我们直接调用这个变量就是调用那个子函数,子函数因为没有需要的局部变量,用的是父函数的变量,所以始终引用着
父函数导致父函数的作用域无法被释放。父函数被调用了一次始终存在,而子函数每次调用都会释放,可是这不关父函数的事,
父函数的局部变量永远是那一个不会变化,用多少是多少。
画一张图;
这张图完美的诠释了我这种表达能力不行的人 写出来的东西 事倍功半 哎!!!!!
浙公网安备 33010602011771号