函数闭包问题的学习
来源:互联网 发布:图像扫描列数据 编辑:程序博客网 时间:2024/05/28 23:23
函数闭包的应用是用来解决异步问题的
<body><ul id="myUl"> <li>111</li> <li>222</li> <li>333</li></ul><script> var myUl=document.getElementById("myUl"); var myLi=myUl.getElementsByTagName("li"); for(var i=0;i<myLi.length;i++){ myLi[i].onclick=function(){ alert(i+1); } }
这里的alert就会报错,因为for循环里面的那个匿名函数,是个异步事件,也就是说代码,顺序执行时,不会执行这个函数,只有当触发事件产生,才会执行这个函数,而此时的循环早已结束,此时的i已经为3,而myLi中是没有类名为3的,故会 报错。此时应用闭包就可以解决问题,其实严格的说,只要是定义了一个函数,这个函数执行时就产生了闭包,闭包只是一种运行机制。
var myUl=document.getElementById("myUl"); var myLi=myUl.getElementsByTagName("li"); for(var i=0;i<myLi.length;i++){ ;(function(i){ myLi[i].onclick=function(){ alert(i+1); } })(i) }
var myUl=document.getElementById("myUl"); var myLi=myUl.getElementsByTagName("li"); for(var i=0;i<myLi.length;i++){ myLi[i].onclick=(function(i){ return function(){ alert(i+1); } })(i) }
修改成上述两种方式都可以,函数在执行的时候,就会形成一个私有作用域,而这个作用域里面定义的参数,是不受外界干扰的。解决异步,即保护作用域里面的参数不受外界的干扰。
关于定时器以setTimeout为例
window.setTimeout(fn(),1000);
此时,会直接执行fn(),并将fn的返回值,加入到setTimeout的队列中,
而且setTimeout天生就是一个异步的。可看一下代码,可见 闭包是处理异步的非常好用的方法。
for(var i=0;i<myLi.length;i++){ window.setTimeout((function(i){ return function(){myLi[i].style.left=100*(i+1)+"px"; } })(i),(i+1)*1000) }
关于函数作用域的释放问题,一般情况下当一个函数执行完之后,这个函数所创建的作用域,将会消失,当这个函数再次执行时,会再 创建一个作用域,前后两个作用域不干扰。若这个函数中产生了闭包,且这个闭包被一个时间绑定,或者返回给了一个变量,那么这个函数创建的作用域将不会消失。
function fn(){ var i=0; return function(){ console.log(i++); }}var a=fn();a();a();
两次打印分别为0和1。是因为 返回的函数赋给了变量,在var a=fn()这一句中函数所创建的作用域就不会被释放。
0 0
- 函数闭包问题的学习
- php闭包函数学习
- js 函数的参数 问题 arguments对象 及闭包
- lambda 函数所引起的闭包问题
- js匿名函数和闭包的学习
- 【学习笔记二】- JS 闭包相关的简单函数
- 从两个函数来学习js闭包的概念
- python函数的闭包问题(内部函数与外部函数详述)
- onclick函数的导包问题
- 学习nodejs第一课,关于js的闭包问题。
- 闭包的学习
- 闭包的学习
- 关于setTimeout函数中的闭包问题
- 关于python函数闭包问题
- 【笔记】关于js的匿名函数问题, 还有闭包的问题, 做下笔记
- 【great】js函数闭包学习贴
- Swift学习函数和闭包
- Scala学习--函数和闭包
- poj解题报告——2234
- 二三四五六章作业
- 大数模板
- hulu面试经验
- 南邮 OJ 1127 Stick
- 函数闭包问题的学习
- Groovy
- linux下fastboot烧录的方法
- 南邮 OJ 1128 An Industrial Spy
- 在ubuntu12.04中安装wine和sourceinsight
- c++中堆、栈内存分配
- proguard 提示Warning: can't find referenced field/method '...' in library class ...等问题
- /sys/class/gpio 文件接口操作IO端口(s3c2440)
- 记录日志的工具类