JavaScript笔记4--闭包
来源:互联网 发布:mac能玩穿越火线吗 编辑:程序博客网 时间:2024/05/20 18:53
1.啥是闭包?
闭包是一个函数,一个能够读取某函数内部变量的一个函数。
2.闭包有啥用途?
通过闭包可以读取某函数的内部变量,相当于扩大了变量的访问范围;
3.闭包举例
示例1
function add(num1,num2){ var innerAdd = function(){ alert(num1+num2); } return innerAdd; }//客户端:$(function(){ var innerAdd = add(1,2); setTimeout(innerAdd,5000); var innerAdd = add(2,2); setTimeout(innerAdd,5000);});</script>
innerAdd 是一个闭包,它延长了变量num1、num2的生命时间;
注意,此时的num1、num2是形参哈;
示例2
<script type="text/javascript">$(function(){/*************** 给每个span元素追加点击事件 ****************/ //test1 var spans = $("#divTest span"); for (var i = 0; i < spans.length; i++) { var clickFunction = function() { alert(i); }; spans[i].onclick = clickFunction; } //test2 var spans = $("#divTest span"); for (var i = 0; i < spans.length; i++) { function out(num){ var clickFunction = function() { alert(num); }; return clickFunction; } spans[i].onclick = out(i); }});</script>--------------------------------------<body> <div id="divTest" > <span>0</span> <BR/> <span>1</span> <BR/> <span>2</span> <BR/> <span>3</span> <BR/> </div></body>
test1结果:
每次都是4。原因分析:
clickFunction 是一个闭包,它延长的是变量 i 的生命时间。注意,此时的 i 可不是形参哈。
当i的值为4的时候,判断条件不成立,for循环执行完毕。但是因为每个span的onclick方法这时候为内部函数,所以i被闭包引用,内存不能被销毁,i的值会一直保持4。直到程序改变i的值或者所有的onclick函数销毁(主动把函数赋为null或者页面卸载)时才会被回收。这样每次我们点击span的时候,onclick函数会查找i的值(作用域链是引用方式),一查等于4,然后就alert给我们了。
也就是说,当for循环执行完毕,此时的 i = 4;由于闭包延长了 i 的生命时间,所以在内存中,i =4 一直存在着。当点击事件触发时,会弹出4.
test2结果:
分别是1,2,3,4。原因分析:
clickFunction 是一个闭包,它延长的是变量 num 的生命时间,并不是变量 i 。
每次调用out函数,都会新创建一个新的out函数的作用域空间。所以闭包延长的是当前变量 num 的生命时间。注意,此时的 num 是形参,这个形参的值来自于 i 。
从本质上讲,如果内部函数引用了位于外部函数中的变量,相当于授权该变量能够被延迟使用。因此,当外部函数调用完成后,这些变量的内存不会被释放(最后的值会保存),闭包仍然需要使用它们。
- JavaScript笔记4--闭包
- JavaScript学习笔记4-闭包
- javascript笔记-----------js闭包
- JavaScript闭包---笔记摘抄
- JavaScript 闭包学习笔记
- JavaScript闭包学习笔记
- JavaScript 学习笔记七 闭包
- JavaScript学习笔记(6)---闭包
- javascript 学习笔记(3) 闭包
- JavaScript内核笔记06-闭包
- Javascript笔记《四》之闭包
- JavaScript学习笔记十四:闭包
- 学习笔记:JavaScript——闭包
- javascript学习笔记(二)-闭包
- Javascript闭包和this学习笔记
- JavaScript学习笔记之闭包
- Javascript学习笔记_闭包
- 闭包《javascript高级程序设计》笔记
- 欢迎使用CSDN-markdown编辑器
- Android volley 使用OkHttp3.0
- 使用第三方授权登录以及分享文字和图片
- 页面checkbox处理
- HR筛选简历的12个要点,投简历必读!
- JavaScript笔记4--闭包
- 汉诺塔(三)
- EditText常用属性【三】:EditText选取操作
- MINGW64位编译QT
- spark dataframe新增列的处理
- Smobiler实现图表分析功能—Chart控件(开发日志十一)
- android activity的四种启动模式
- PHP+ajax实现连接数据库、加载更多
- 优化Android Studio/Gradle构建