关于闭包,最简单的描述就是 ECMAScript 允许使用内部函数--即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。
子函数的作用域与其外部函数的局部变量一直是绑定的。
- //闭包的错误使用
- function fcn(){
- var messages = ["A", "B", "C"];
- for (int i = 0; i < items.length; i++) {
- var item = messages[i];
- //创建嵌套函数就形成了一个闭包,当触发node onclick时,产生闭包,
- //即使fcn()函数执行返回但自函数仍可访问其变量item,函数输出永远为 “C”
- node[i].onclick = function(event) { alert(item); }
- }
- }
- //正确使用创建工厂方法创建闭包
- function makeOnClick(item) {
- return function() { alert(item); }
- }
- function fcn(){
- var messages = ["A", "B", "C"];
- for (int i = 0; i < items.length; i++) {
- var item = messages[i];
- node[i].onclick = makeOnClick(item);
- }
- }