javascript闭包(closure)
概念:闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。函数内部创建的函数,可以访问该函数的作用域,这个内部函数就叫做闭包,是函数内部和函数外部建立连接的桥梁。
最简单的例子:
function a() { var a = "hello"; // a函数内的局部变量 function b() { // 函数内部的函数,函数b就是闭包 console.log(a); // 通过b函数访问a函数内的局部变量a } return b; // 关键,返回b函数 }
运行:
a()(); // 结果是"hello"
分析:
1.因为函数b在函数a的内部,所以函数a中所有的局部变量对于b函数都是可见的,这是由javascript语言特有的“链式作用域(chain scope)”结构特性决定的,子对象会一级一级地向上寻找所有父对象的变量,直到找到为止。内部函数b的作用域链中包含了外部函数a的作用域。而通过由返回函数b达到访问函数a中的局部变量的效果。
2.因为函数a是函数b的父函数,而函数b被赋给了一个全局变量,导致了函数b始终在内存中,而函数b的存在依赖于函数a,导致函数a也始终在内存中,不会在调用结束后被垃圾回收机制(garbage collection)回收。使用闭包会使得函数中的变量都被保存在内存中,内存消耗很大,滥用闭包可能会导致网页性能问题,解决方法是在退出函数前将不使用的局部变量全部删除(给变量赋值undefined)。
"林深时雾起,海深时浪涌,梦醒时夜续,我不见鹿,不见鲸,也不见你。"
你要去做一个大人,不要回头,不要难过。