javascript - js 获取标签li的下标值
天蓬老师
天蓬老师 2017-04-10 16:52:07
[JavaScript讨论组]


这样的一种方式遍历,为什么一直是最后一个i值,前面的i值为什么没有进去onclick事件中;
我知道可以用参数传递进去可以实现,我现在不懂的是,为什么这种不行,是哪里出了问题~

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(5)
PHP中文网

这是典型问题了,不好理解。看一下我的示例代码:

(function () {
    var cl = console.log;
    
    //要求:用循环语句,创建5个函数,当调用这些函数时,第一个函数输出0,第二个输出1,以此类推
    
    //这样写可以吗?
    var funcs = [];
    for (var i = 0; i < 5; i++) {
        funcs[i] = function () {
            cl(i);//执行这条语句时,所使用的i的值已经是5了
        }
    }
    //此时i的值是5,看看:
    cl('i的值是:' + i);
    funcs.forEach(function (func) {
        func();
    });//5 5 5 5 5 不行
    
    //这样写就行了:
    funcs = [];
    for (var i = 0; i < 5; i++) {
        funcs[i] = (function (a) {
            return function () {
                cl(a);//由于内部函数使用到a,所以这个a的值会暂留在内存中
            }
        })(i);//外部函数在这里已经被执行,所以i的值会复制到a
    }
    funcs.forEach(function (func) {
        func();
    });//0 1 2 3 4

})();
PHP中文网

闭包的问题。
可以传参数进去解决这个问题。

PHP中文网

今天刚回答了一个类似的问题 你先看看吧啊
http://segmentfault.com/q/1010000004322692

大家讲道理

你代码中每一个.onclick的匿名函数都绑定到同一个i变量,而不是i的
当这些匿名函数被执行时才会真的使用i的, 这时i的值固定为li.length

如果你想这些匿名函数使用不同的值,就需要把它们绑定到不同的变量。典型写法就是IIFE。

阿神

<ul id="list">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
</ul>
<script type="text/javascript">

 var ul = document.querySelectorAll('li');

 for (var i = ul.length - 1; i >= 0; i--) {

    (function(i){
        ul[i].onclick = function(){
            alert(i+1);
        }
    })(i)
     
 }


    
</script>

虽然let一下就可以解决,但是它本意考察闭包

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号