开发者社区> 问答> 正文

这是一段JS函数,其中有一些不明白的地方

今天在查看网上淡入淡出的轮播原代码时,有一些不明白的地方

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来关闭?

麻烦各位朋友帮忙解决下小弟的困惑,万分感谢!!!

展开
收起
杨冬芳 2016-06-21 10:17:52 1870 0
1 条回答
写回答
取消 提交回答
  • IT从业

    問題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 看範例)我能說什麼呢!?

    2019-07-17 19:44:33
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
JavaScript函数 立即下载
Delivering Javascript to World 立即下载
编程语言如何演化-以JS的private为例 立即下载