function(obj,len){
for(i=1;i<=len;i++){
document.getElementById(obj+"_btn"+i).onclick=(function(i){
return function(){
for(var j=1;j<=len;j++){
document.getElementById(obj+"_con"+j).style.display=(i==j)?"block":"none";
document.getElementById(obj+"_btn"+j).className=(i==j)?"curr":"0";
}
}
})(i)
}
请问(function(i)中的return function()的作用是什么?
为什么把return function()去掉 直接(function(i){……}就出错了呢
js初学 自己搜索了一下 仍百思不得其解
解决方案 »
- 求js模拟alert()方法的阻塞功能
- 关于jquery多个bind事件的处理
- object.attributes('id') is not function 错误
- Firefox加入收藏夹以后为什么默认总在sideBar打开?
- FF中,如何输出选中范围的 HTML内容 ???
- 大哥帮我看一下这一小段代码,哪里有问题?
- Extjs4.1学习系列:第十讲 textfield组件的基本用法
- iscroll和phinegap结合制作下拉效果
- 急,javascript不会调试,很简单的问题,帮我看看
- 文本框内的光标判断的问题。
- IE中可以添加自定义的属性到window对象吗?
- Extjs 的Panel自适应高度问题,附图
{
alert("x")
}
html.onclick = x
document.getElementById(obj+"_btn"+i).onclick=(function(i){
return function(){
for(var j=1;j<=len;j++){
document.getElementById(obj+"_con"+j).style.display=(i==j)?"block":"none";
document.getElementById(obj+"_btn"+j).className=(i==j)?"curr":"0";
}
}
})(i)
你这段代码是执行一个函数 ,然后返回一个函数
结果就是 document.getElementById(obj+"_btn"+i).onclick=function(){
var i = x;这值变动,不定
for(var j=1;j<=len;j++){
document.getElementById(obj+"_con"+j).style.display=(i==j)?"block":"none";
document.getElementById(obj+"_btn"+j).className=(i==j)?"curr":"0";
}
}
}
for(var i=1;i<=len;i++){
document.getElementById(obj+"_btn"+i).onclick=function(){
for(var j=1;j<=len;j++){
document.getElementById(obj+"_con"+j).style.display=(i==j)?"block":"none";
document.getElementById(obj+"_btn"+j).className=(i==j)?"curr":"0";
}
} }
}
在2楼不是已经说了么。。 JS的变量作用域问题。
function(obj,len){
for(var i=1;i<=len;i++){
document.getElementById(obj+"_btn"+i).onclick=function(){
alert(i)
// for(var j=1;j<=len;j++){
// document.getElementById(obj+"_con"+j).style.display=(i==j)?"block":"none";
// document.getElementById(obj+"_btn"+j).className=(i==j)?"curr":"0";
}
} }
}
把i弹出来看看就知道了
function closureFunc (i) {
return function(){
for(var j=1;j<=len;j++){
document.getElementById(obj+"_con"+j).style.display=(i==j)?"block":"none";
document.getElementById(obj+"_btn"+j).className=(i==j)?"curr":"0";
}
}
}
for(i=1;i<=len;i++){
document.getElementById(obj+"_btn"+i).onclick=closureFunc(i);
}
}
for(var j=1;j<=len;j++){
document.getElementById(obj+"_con"+j).style.display=(i==j)?"block":"none";
document.getElementById(obj+"_btn"+j).className=(i==j)?"curr":"0";
}
}你这样想..你返回的是个函数,而这个函数里面包含了对外层函数的变量i的引用。但是记住,你当前是给onclik事件绑定了这个函数,而在你绑定的时候,并没有发生任何关于你绑定函数的onclik事件.所以onclick绑定的函数不会运行.
但外层的for(var i=0;i<len;i++)是不会关这些的,他会一直运行下去,因为它与onclik事件无关,如果len等于5,那么i运行完毕后就等于5.
这个时候,如果你绑定的onclick事件的元素被点击,JS才会去执行你绑定的函数,这个时候JS才去查看i的值为多少,那么它发现i为5,所以你的每个onclick事件函数中的i都会等于5..而使用function(){}这样的函数闭包,就是为了防止i作用域的变化,固定在当前值!
return function() 你不理解。那return 1 或 是return false 之类的理解么,是一样的呀。举例:function fn1(){
var a='hello';
return a;
}f1()//返回hellofunction fn2(){
var a=function(){return 'hello'};//var定义,就像定义一般数据一样,function也是数据的一种
return a;//a也是数据,所以也可以返回
}
f2()()//返回hello