javascript 常见的闭包问题的解决办法
0
1
2
3
4
5
6
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
上段代码本意是在每个div上都加一个事件,即每当点击div时,就显示此div的相应序号。但是运行程序时我们会发现,不论点击那个,只会显示7,这是什么愿因呢。--这就是闭包的问题
原来 在js中,函数中在定义函数,就出现闭包了。此时外层函数中变量是可以在里层函数里利用的,即使外层函数结束。但是当外层中出现循环的时候,如果在里层函数中利用这个循环变量的话,会直接引用这个变量的最终值。
就像上述代码演示的一样。
如何解决呢。
可以利用匿名函数来加以解决。匿名函数会制动执行,我们可以利用这一特性,来产生一个作用域,生命一个变量,来引用外层的循环变量。
如代码所示:
0
1
2
3
4
5
6
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
由于在内层函数里只要出现循环变量的话 都是最终值,所以我们利用匿名函数 激发出一个作用域,在进入内层循环之前,有另一变量获得该循环变量的值,这一思想是处理闭包问题的精髓。
如下例子:此时并没有明显的for循环,但是 根据上述思想,可以立即加以解决 问题
"+text;
divChild.onclick=function()
{
alert("row"+id);
$("row"+id).value=text;
}
id++;
}
// -->
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
解决后代码:
"+text;
(function(){
var d=id;
divChild.onclick=function()
{
alert("row"+d);
$("row"+d).value=text;
}
})()
id++;
}
// -->
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
补充:看到有网友这样解决了问题:
"+text;
divChild.onclick=function(f){
return function(){
alert(f);
}
}(id)
id++;
}
// -->
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
我个人的理解是 在进入内层循环之前 把id赋值给f,f在作为内层循环的参数,其思想应该是一样的.
您可能感兴趣的文章:
- javascript深入理解js闭包
- JavaScript 匿名函数(anonymous function)与闭包(closure)
- 前端开发必须知道的JS之闭包及应用
- 详谈JavaScript 匿名函数及闭包
- JavaScript中的作用域链和闭包
- Javascript 中的类和闭包
- Javascript闭包演示代码小结
- JavaScript 闭包深入理解(closure)
- 一分钟理解js闭包
- JavaScript闭包函数访问外部变量的方法
- js闭包的用途详解
- javascript中闭包概念与用法深入理解
Tags:javascript 闭包问题
相关文章
- 2015-11-11整理Javascript数组学习笔记
- 2013-11-11JavaScript改变HTML元素的样式改变CSS及元素属性
- 2017-07-07详谈for循环里面的break和continue语句
- 2016-09-09前端设计师们最常用的JS代码汇总
- 2017-08-08React应用中使用Bootstrap的方法
- 2009-10-10js removeChild 障眼法 可能出现的错误
- 2014-09-09textarea不能通过maxlength属性来限制字数的解决方法
- 2017-01-01bootstrap table分页模板和获取表中的ID方法
- 2010-12-12Wordpress ThickBox 添加“查看原图”效果代码
- 2016-12-12JS中页面与页面之间超链接跳转中文乱码问题的解决办法