1.什么是闭包
函数嵌套函数,内部函数可以引用外部的参数和变量,参数和变量不会被垃圾回收机制所收回,外部函数最终返回内部函数的函数名。
从垃圾回收机制来看,一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
例如:
1 function test(num){ 2 var sum=5; 3 function alertSum(){ 4 sum+=num; 5 alert(sum); 6 } 7 return alertSum; 8 } 9 var a=test(5); 10 a();//10
2.闭包的作用,应用在哪里
-
好处
1.希望一个变量长期驻扎在内存中
2.避免全局变量的污染
3.私有成员的存在,保护内部变量不被外部调用
-
实际用法:
1.模块化代码,减少全局变量污染。
1 (function(){ 2 //模块化代码 3 })()
2.在循环中不用设置index直接找到对应元素的索引。
1 var aBtn = document.getElementsByTagName('button'); 2 for(var i = 0; i < aBtn.length; i++){ 3 (function(i){ 4 aBtn[i].onclick=function(){ 5 //do something 6 } 7 })(i); 8 }
顺便说一下return
当在 <a href="abc.htm" onclick="return add_onclick()">Open</a> 中
如果函数 add_onclick() 返回 true, 那么 页面就会打开 abc.htm
否则, (返回 false), 那么页面不会跳转到 abc.htm, 只会执行你的 add_onclick() 函数里的内容. (add_onclick函数中控制页面转到 abc.htm除外
)
而 <a href="abc.htm" onclick="add_onclick()">Open</a>
不管 add_onclick() 返回什么值, 都会在执行完 add_onclick 后打开页面 abc.htm
另外补充:
onclick事件时就相当于onclick="return true/false"
例:
1 function check() 2 { 3 if(obj.value=="" ) 4 { 5 window.alert("不能为空!"); 6 obj.focus(); 7 return false; 8 } 9 return true; 10 }
调用方法返回true时才提交表单,反之则不提交,这是submit按钮