javascript - 前端小问题——js操作多个li获取当前li并操作
怪我咯
怪我咯 2017-04-10 16:50:41
[JavaScript讨论组]

我的代码大致是这样的:

var lis = document.getElementById("rotatePoint").getElementsByTagName("li");
for (var i = 0; i < lis.length; i++) {
    //还没搞懂这个为什么会实现这个效果
    (function (x) {
        lis[x].onclick = function () {
            setImg(x);
            setLi(x);
        }
    })(i);
}

主要是这里不懂:

(function (x) {
lis[x].onclick = function () {
setImg(x);
setLi(x);
}
})(i);


小弟这里想请教各位大神给帮忙解释一下,谢谢
或者有新的方法也行。

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
PHPz

实现上面功能的错误写法如下:

var lis = document.getElementById("rotatePoint").getElementsByTagName("li");
for (var i = 0; i < lis.length; i++) {
    //还没搞懂这个为什么会实现这个效果
    lis[i].onclick = function () {
            setImg(i);
            setLi(i);
    };
}

这样写会导致click回调函数执行时setImg/setLi接收到的参数都是lis的最后一个元素~~~
这个问题是由于函数的词法作用域造成的-JS中只有函数有变量作用域,没有块作用域,变量作用域在声明的时候被确定。
上面代码中的click函数会使用到变量i,而这个变量定义在外层函数中,当回调函数执行时大家看到的变量就是外层函数中的同一个变量i,之所以能访问到i涉及到函数闭包的问题

所以为了避免这个问题,保证每一个回调函数调用到自己对应的i,需要将i封在一个函数作用域下,就定义一个函数,并且这个函数接收一个参数,作为回调函数将要使用到的值;这个函数需要在定义的时候就要被执行掉,否则又会回到原来存在问题~~~

(function (x) {
        lis[x].onclick = function () {
            setImg(x);
            setLi(x);
        }
})(i);

这个写法涉及到的知识点:
JS词法作用域
函数闭包

讲的有点绕,请搜索一下~~~

大家讲道理

那里是一个闭包,用过创建一个匿名函数作用域保存i的值
因为onclick是异步操作,所以i本身会变量提升。

楼主对比一下不使用匿名函数的情况就可以明白

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

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