今天在查看网上淡入淡出的轮播原代码时,有一些不明白的地方
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
思考一下下面這個簡化的例子
原理就是利用閉包去保留 context 我推薦這篇寫的挺詳細的。
問題3
參考這篇
第二則回答從 w3c 定義推論出他們是一樣的。可以視為同意。
不過我暫時比較接受第一個答案不應該互通,不過事實是大部分瀏覽器實作上是共用 timer 清除,所以可把它們視為同意,但不該認為兩者就沒有差別。
看看w3c自己的範例都用了(搜尋 clearTimout 看範例)我能說什麼呢!?