js 取值 问题?

        timeDown:function (time,interval,callback) {
            var timeCount=setTimeout(function () {
                (callback||new Function)();
                if(time===0){
                    clearTimeout(timeCount);
                }else{
                    time--;
                    console.log(time);
                    setTimeout(arguments.callee,interval);
                }
            },interval);
        }
以上实现一个倒计时功能

我希望这样调用

A.timeDown(60,1000,function(){
    //do something
    $("#xx").text(time)  //我希望能够获取 正在变化的time
})

首先我这么设计应该没啥问题吧?
我的问题是 ,我能否取出 timeDown里不停变化的time作为callback里的参数,应该怎么实现?
(不考虑使用一个全局变量来接收或者传递time)

若干年后我自问自答

        timeDown:function (time,interval,callback) {
            var timeCount=setTimeout(function () {
                (callback||new Function)(time);
                if(time===0){
                    clearTimeout(timeCount);
                }else{
                    time--;
                    console.log(time);
                    setTimeout(arguments.callee,interval);
                }
            },interval);
        }


A.timeDown(60,1000,function(e){
    //do something
    $("#xx").text(e)  //我希望能够获取 正在变化的time
})
阅读 3.3k
8 个回答

代码这样写:
arguments.callee不推荐使用,就像eval一样

function timeDown(time,interval,callback) {
    var timeCount;
    var timeFun = function () {
        if (time === 0) {
            clearTimeout(timeCount);
        } else {
            time--;
            timeCount = setTimeout(timeFun, interval);
        }

        callback && callback(time);
    };

    setTimeout(timeFun, interval);
}

timeDown(60,1000,function(time){
    //do something
    console.log("time:"+time);
});

最好用setInterval,因为每次setTimeout都是一个新的定时器。
下面这个不需要在全局里面加变量,也不需要在A里面加其他东西。

timeDown: (function () {
    // 局部变量存放time值
    var _time = 0;
    function timeDown(time, interval, callback) {
        _time = time;
        // 开启定时器
        var timer = setInterval(function () {
            // 执行回调
            callback && callback();
            // 判断次数
            if (--_time <= 0) {
                clearInterval(timer);
            }
        }, interval);
    }

    // 只暴露一个getTime给外部获取time值
    timeDown.getTime = function () {
        return _time;
    }

    return timeDown;
})()

A.timeDown(60, 1000, function () {
    //do something
    console.log(A.timeDown.getTime())  // 使用timeDown.getTime获取到time值
})
var A = {
    time: 0,
    timeDown: function(time, interval, callback) {
        var that = this;
        that.time = time;
        var timeCount = setTimeout(function temp() {
            (callback || new Function)();
            if (that.time === 0) {
                clearTimeout(timeCount);
            } else {
                that.time--;
                console.log(that.time);
                setTimeout(temp, interval);
            }
        }, interval);
    }

};

A.timeDown(60, 1000, function() {
    //do something
    /*$("#xx").text(time) */ //通过 A.time 获取实时的 time
});

给A一个time属性
计时器中的time和A.time保持一致

timeDown: function(time, interval, callback) {
    var timer = setInterval(function () {
        callback && callback(time)

        if (--timer < 0) {
            clearInterval(timer);
        }
    }, interval);
}
timeDown: function (time, interval, callback) {
        var timeCount = setTimeout(function () {
          (callback || new Function)(time);
          if (time === 0) {
            clearTimeout(timeCount);
          } else {
            time--;
            setTimeout(arguments.callee, interval);
          }
        }, interval);
      }
    }
    A.timeDown(60, 1000, function (time) {
      console.log(time) //我希望能够获取 正在变化的time
    })

这样是否满足题主的要求?

let timeDown = function(sum, interval, callback) {
  callback(sum);
  if(sum <= 0){ return }
  setTimeout(function(){
    timeDown(sum - interval, interval, callback);
  }, interval);
}

timeDown(10 * 1000, 1000, function(t){console.log(t)});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题