- 什么是闭包?
- 《JavaScript权威指南》:函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性叫闭包。从技术的角度讲,JavaScript中所有函数都是闭包:他们都是对象,他们都关联到作用域链。
- 《JavaScript精粹》:内嵌函数可以在任何情况下访问其外围环境中的变量的这种能力。
- 我的理解:基于《JavaScript精粹》的定义,加以解释。内嵌函数,可以在任何情况下访问其外围环境中的变量,即使在其父级函数执行完毕后,内嵌函数仍然可以访问其父级函数定义的局部变量。
- JS作用域?
- JS作用域包括全局作用域和方法作用域。
- 全局作用域不用作解释了吧。
- 方法作用域:简单的理解 {} 花括号里面的。方法作用域保护其内部变量不能被外部访问。
- 作用域链:用于保证程序的有序执行,在函数对象的创建的时候就已经形成,不是在执行的时候形成。
- JS链式作用域:子对象会一级一级的向上寻找所有父对象的变量,所有父对象的所有变量对子对象完全可见,反之则不行。
- 闭包的作用:
- 读取函数内部变量。
- 让这些变量始终保持在内存中。
//*举个栗子*
function par(){
var a="hello";
add=function(){
a+=" world";
}
function show(){
alert(a);
}
return show;
}
var result=par();
result(); // hello
add();
resule(); // hello world
注意事项:
- 过多的使用闭包会导致函数中的变量都保存在内存中,内存消耗很大,不能滥用闭包,否则会照成网页性能问题,IE中可能导致内存泄漏。
- 解决方法:在突出函数之前将不使用的局部变量删除。
- 闭包会在函数外部改变父函数内部变量的值。