javascript for 循环的问题

我的想法是点击每一个li就显示相对应i,比如点击第一个就显示0点击第二个就显示1,但是无论怎么样都显示的是5我觉得我对for循环的理解不是很透彻。谁能帮我解答一下?<sc... 我的想法是点击每一个li就显示相对应i,比如 点击第一个 就显示0点击第二个就显示1,但是无论怎么样 都显示的是5 我觉得我对for循环的理解不是很透彻。谁能帮我解答一下?
<script>
function list(){
var _li=document.getElementsByTagName("li");
for(i=0;i<_li.length;i++){
var _tmp=i;
_li[i].onclick=function(){
alert(i);
}
}

//alert("sad");
}
window.onload=function(){list()};
</script>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
展开
 我来答
zcj324
2013-10-12 · TA获得超过189个赞
知道答主
回答量:45
采纳率:0%
帮助的人:32.5万
展开全部

你那种:

_li[i].onclick=function(){

alert(i);

}

相当于把右面的方法引用赋给onclick事件,所以只有真正点击的时候才去找变量i的值


而“寻_常”的那种:

_li[i].onclick=(function(i){

                    return function(){

            alert(i);

            }

        })(i);

右面是一个自调用函数,自调用函数格式

(匿名函数)();

因为这个匿名函数没有名字,也没有复制给变量,所以需要这样调用,然后这个匿名函数里面执行返回方法引用的语句,而且每次都去找了变量i的当前值,所以能得出正确的结果。


如果你理解了,可以这样写:

_li[i].onclick= new Function("alert(" + i + ")");
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
溥傲厹d
2013-10-12
知道答主
回答量:11
采纳率:0%
帮助的人:3.9万
展开全部
这个不是循环的问题,在刷新页面的时候,就开始执行for语句,为每个li元素绑定点击事件。但是onclick里面的alert会在点击事件发生之后才会执行的。所以,这个时候变量i的值是根据当前i的值来定的。你可以试一下,在循环外面加一句 i = 100。你就会发现现在报的就是100了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Inpool
2013-10-12 · TA获得超过782个赞
知道小有建树答主
回答量:486
采纳率:66%
帮助的人:445万
展开全部
function list(){
    var lis = document.getElementsByTagName('li');
    for(i=0; i<lis.length; i++){
        lis[i].onclick = function(){
            for(j=0; j<lis.length; j++){
                if(lis[j] == this){
                    alert(j);
                    return;
                }
            }
        }
    }
}
追问
受累问一下 这个this 代表的是什么???可以用lis[i].替换吗
追答
this就是你单击的那个li,不能替换
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
尋_常
2013-10-12 · TA获得超过837个赞
知道小有建树答主
回答量:529
采纳率:0%
帮助的人:503万
展开全部
_li[i].onclick=(function(i){
                    return function(){
alert(i);
}
})(i)
更多追问追答
追问
不知道算不算钻牛角尖 ,我见过有一种写发也是用的闭包。我想问问,问什么我写的那种不行,而闭包就可以???
追答

首先你要搞清楚为什么你的那种不行,我们来看一个例子

var arr = [];
for(var i = 0; i< 5;i++)
    arr.push(function(){return i});
alert(arr[0]())//5
简化后就是
var a =0;
function abc()
{
    return a;
}
a = 5;
abc();//5
能明白?当定义函数时,里面虽然有个i,但是没有执行。当函数执行的时候,i已经是5了,自然是返回5而不会返回其他的
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式