以为能写出静态页面,能写出js交互就可以混口饭吃,所以一直没有去深究一些原理和知识,老觉得会写就行,不会再去查嘛!殊不知说不出来,也是得不到认可的。 做到了“知其然”,为什么不加一把劲做到“知其所以然”呢?
W3school给出的闭包(closure)概念是:
闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。
这他喵说的是什么意思,不太懂啊… 所以继续掏度娘的脑仁…
想了解闭包,就要先了解变量的作用域,都知道,变量分为全局变量和局部变量。函数内部声明的变量是局部变量。如果对JavaScript有一点了解的,都知道函数内部可以访问全局变量,但是在函数外部想要得到函数内部的变量,怎么办呢?这个时候,闭包就闪亮登场了…
举一个栗子:
function foo1(){
n=999;
function foo2(){
return n ; // 999
}
}
foo1();
函数foo2被函数foo1包裹在里面,函数foo1的局部变量对于函数foo2来说就是可见的,也就是说函数foo2是可以调用到函数foo1中的局部变量n的,但是,函数foo2内的局部变量对于函数foo1来说是不可见的,为foo2私有。
这里可以看到JavaScript“链式作用域”的特性。子对象会逐级向上查找父对象的变量,但是父对象是不能反过来查找子对象的变量的。
回到我们的目的:怎么在foo1外部得到foo1内部的变量。
既然foo2可以得到foo1的变量,那直接把foo2整个全部返回(return)不就行了吗?
如下:
function foo1(){
n=999;
function foo2(){
return n ;
}
return foo2;
}
var result=foo1();
result(); // 999
注意: 这里的函数foo2就是闭包!!! 知道了什么样的代码形式可以称为闭包,剩下的就是怎么用口语描述出来了。
可以理解为,闭包就是可以读取其他函数内部变量的函数。
本质上来说,闭包是连接函数内部与函数外部的桥梁。
闭包的用途:
1,读取函数内部的变量。
2,变量的值始终保持在内存中不被垃圾回收机制(garbage collection)销毁。
使用闭包需要注意的地方:
1,由于使用闭包后,变量始终在内存中不被GC回收,所以就存在内存消耗问题,有可能会引起内存泄露,尽量在退出函数时将不再使用的局部变量删除。
2,由于使用闭包后,函数外部可以获取甚至修改函数内部的局部变量,因此在修改时,请特别注意修改函数内部局部变量是在你明白的情况之下,以免引起不可预知的错误。