今天在查看网上淡入淡出的轮播原代码时,有一些不明白的地方
function addEvent(){
for(var i=0;i<otxtLen;i++){
(function(_i){
oBtn[_i].onclick=function(){
clearTimeout(autoChange);
changeTo(_i);//这是调用开始轮播的变换函数
curIndex=_i;
autoChange=setInterval(function(){
if(curIndex<otxtLen-1){
curIndex++;
}
else{
curIndex=0;
}
changeTo(curIndex);
},2500);
}
})(i);
}
}
问题1:
这个(_i)传进去的值是for循环的i吗?
我试着把(_i)改成(i),运行起来也是没有问题。
问题2:
什么for循环里面的function要用圆括号包起来?结尾有一个(i)是做什么用的呢?
问题3:
代码中clearTimeout(autoChange);为什么setInterval可以用clearTimeout来关闭?
麻烦各位朋友帮忙解决下小弟的困惑,万分感谢!!!
問題1 _i 是 for 的 i 帶入的沒錯不過更嚴格地說是 IIFE 立即函式就下面那個 i 傳入的,_i 應該是為了避免疑義。
問題2
思考一下下面這個簡化的例子
var funcs = [];
for (var i = 0; i < 10; i++) {
funcs[i] = function () {
console.log(i); // 當你的 event 需要 i 時
}
}
funcs[0](); // 預計是 0 但輸出是 10
var funcs = [];
for (var i = 0; i < 10; i++) {
(function (i) {
funcs[i] = function () {
console.log(i); // 當你的 event 需要 i 時
}
})(i);
}
funcs[0](); // 就是 0 了
原理就是利用閉包去保留 context 我推薦這篇寫的挺詳細的。
問題3
參考這篇
第二則回答從 w3c 定義推論出他們是一樣的。可以視為同意。
不過我暫時比較接受第一個答案不應該互通,不過事實是大部分瀏覽器實作上是共用 timer 清除,所以可把它們視為同意,但不該認為兩者就沒有差別。
看看w3c自己的範例都用了(搜尋 clearTimout 看範例)我能說什麼呢!?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。