javascript for()循环里面的setInterval闭包问题, 看看我哪写错了
阿神
阿神 2017-04-10 15:26:19
0
5
385
ShowCountDown(a,b,c,d,e){

}
for(var i=0; i<4; i++){
            var timeString = '<?php echo $timeString?>';
            var time = timeString.split(','); 
            var filterArray = time[i].split('-');
            window.setInterval((function(a,b,c,d,e){
            ShowCountDown();
            })(filterArray[0],filterArray[1],filterArray[2],'time',i)
            ,interval);
        }
阿神
阿神

闭关修行中......

全員に返信(5)
刘奇

setInterval 的第一个参数是传一个function,你这里是已经执行了匿名函数,也就是说是这个函数的返回值。试下下面的代码:

setInterval(
    function() {
        (function(a, b, c, d, e) {
             ShowCountDown();
        })(filterArray[0],filterArray[1],filterArray[2],'time',i);
    }
    ,interval); 
) 
いいねを押す +0
伊谢尔伦

接着1L
for(....)
{
(function(a, b, c, d, e){
setTimeout(function(){
ShowCountDown(a, b, c, d, e);
},1000*e)
}(filterArray[0],filterArray[1],filterArray[2],'time',i))
}
我给的 类似于一个时间计时器不知道你的需求是不是这样。

いいねを押す +0
PHPzhong

你的写法有问题,setInterval函数第一个参数接收的是一个function对象或者是一个代码片段的字符串表示(这个很拗口,说白了就是把你要执行的代码用“”包起来)。而你现在这种写法是先执行的匿名函数,然后将匿名函数的返回值给了setInterval的第一个参数。显然你的匿名函数并没有返回任何东西。
你可以这样写

for (var i = 0; i < 4; i++) {
    window.setInterval(function(){
                todo(i);
    },interval);
}

但是这样写有另外一个问题,setInterval是异步的,等到到达执行的时间的时候,里面的i已经变成3了。需要通过作用域来确保变量的值是想要的值。

for (var i = 0; i < 4; i++) {
    (function(i1){
        window.setInterval(function(){
            todo(i1);
        },interval);
    })(i);
}
いいねを押す +0
左手右手慢动作

window.setInterval方法接收的一个参数为一个函数,而非一个函数调用

いいねを押す +0
洪涛

楼主想要使用闭包来解决 for 循环和异步调用的问题,思路是对的,但setInterval 第一个参数,应该是一个函数,我明白楼主的意思,是想把这些参数传给 ShowCountDown,这里可以这样改

ShowCountDown(a,b,c,d,e){

}
for(var i=0; i<4; i++){
  var timeString = '<?php echo $timeString?>';
  var time = timeString.split(','); 
  var filterArray = time[i].split('-');
  window.setInterval((function(a,b,c,d,e){
    return ShowCountDown.bind(null, a, b, c, d, e);
  })(filterArray[0],filterArray[1],filterArray[2],'time',i), interval);
}

关于bind的介绍 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート