js-我理解的闭包
Posted 鲜荣彬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js-我理解的闭包相关的知识,希望对你有一定的参考价值。
一:什么是闭包
《JS高级程序设计》指出:闭包是指有有权访问另一个函数作用域中变量的函数。
二:闭包的使用
闭包的常见的创建方式是 子函数嵌套在父函数的内部,这样,子函数就可以访问父函数中的变量。
1 function add(){ 2 var a=1;
//暂且叫 innerAdd 函数 3 return function(){ 4 a++; 5 console.log(a); 6 } 7 } 8 add()(); 9 add()(); 10 console.log("------------------------"); 11 var addAfter=add(); 12 addAfter(); 13 addAfter();
8行---- 2
9行-----2
12,13行 ---2,3
那么,为什么第9行得到的结果仍然是2,而不是期待中的3呢?
这里因为JS里也有 C# Java里中的 垃圾回收 机制。
(1) 函数未被引用,执行完后,该函数作用域就会被回收。
(2)函数如果被其他变量引用,该函数作用域就会被保存下来。
第8,9行,add()函数并没有被其他变量引用,只是简单的执行,因此,a的作用域只存在该函数中。
11行,add()函数被外部变量 addAfter引用,函数中的a的值被保存在内存中。
可以这样说:如果innerAdd函数被父亲函数add之外的函数所引用,这样就形成了一个闭包,否则,是不能形成闭包的。
还有另外一种使用形式:
1 var addMatch=(function(){ 2 var a=22; 3 return function(){ 4 a++; 5 console.log(a); 6 } 7 })(); 8 addMatch(); 9 addMatch();
三:闭包的问题
闭包只能取得包含函数中的最后一个变量值,保存的是整个变量对象,而不是某个特殊的变量。
1 var arr1=[12,19,3],arr2=[],arrLength=arr1.length; 2 for(var i=0;i<arrLength;i++){ 3 arr2[i]=function(){ 4 console.log(i); 5 return i; 6 }; 7 }
四:闭包的应用场景
以上是关于js-我理解的闭包的主要内容,如果未能解决你的问题,请参考以下文章