如何在JavaScript中将intervalID传递给interval函数?

6
在JavaScript中,当我创建一个间隔时,我想要在函数内部停止该间隔,但是我不想像这样从外部引用ID值。
var y = setInterval(function(){ clearInterval(y); }, 1000);
我想要的是传递一个类似于这种风格的变量。
setTimeout(function(data){alert(data);}, 1000, "data");
这对于setInterval也适用,只是我不能真正传递由setInterval函数返回的id值,因为它在调用后创建。目前,我正在进行以下hack:
var r = [];
var y = setInterval(function(r){ if (r.length==1) { clearInterval(r[0]); } }, 1000, r);
r.push(y);

有人知道正确的方法吗?

谢谢


正确的方式似乎是第一段代码...我不明白你为什么要这样做... - elclanrs
1
除了“去启动你的时间机器!”这个答案,你还期望得到什么回答呢?因为 setInterval 函数返回的 id 值是在调用函数之后创建的,所以我实际上无法传递该值。 - CBroe
当然,你可以将整个东西封装到一个对象中(如果你反对在全局范围内保留间隔ID的变量)。 - CBroe
你不想从外部引用变量 -> 这就是它的设计,你别无选择,参见http://www.w3schools.com/jsref/met_win_clearinterval.asp。 - Walfrat
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
5
你需要使用返回值,但这并不意味着该变量需要被其他任何东西访问;只需进行封装:
(function() {
    var y = setInterval(function(){ clearInterval(y); }, 1000);
})();
在上述代码中,y 只能在外层匿名函数内部访问,该函数仅包含间隔函数,没有其他内容。 你甚至可以给自己创建一个可重用的 setInterval 包装器来执行此操作。
function setIntervalWrapper(callback, time) {
    var args = Array.prototype.slice.call(arguments, 1);
    args[0] = setInterval(function() {
        callback.apply(null, args);
    }, time);
}

在指定其他参数之前,将时间处理程序作为第一个参数传递。这样做的好处是可以可靠地跨浏览器支持后续参数(一些旧版浏览器不支持将参数传递给回调函数)。

举个例子:

function setIntervalWrapper(callback, time) {
    var args = Array.prototype.slice.call(arguments, 1);
    args[0] = setInterval(function() {
        callback.apply(null, args);
    }, time);
}

var counter = 0;
setIntervalWrapper(function(handle, arg1, arg2) {
    console.log("Interval callback called, handle is " + handle + ", args are '" + arg1 + "' and '" + arg2 + "'");
    if (++counter > 5) {
        console.log("counter > 5, stopping");
        clearInterval(handle);
    }
}, 500, "a", "b");


0

您可以创建一个新的方法,以提供您所需的功能,例如

window.createInterval = function(cb, timeout, data) {
  if (typeof cb !== "function") {
    throw new Error("Please provide a callback.");
  }

  var interval = window.setInterval(function(data) {
    cb(data, interval);
  }, timeout || 0, data);

  return interval;
};

现在这个像这样工作

var myInterval = window.createInterval(function(data, interval){
  console.log(data, interval);
}, 1000, "Hello");

打印出Hello和间隔ID(与我的间隔相同)

window.createInterval = function(cb, timeout, data) {
  if (typeof cb !== "function") {
    throw new Error("Please provide a callback.");
  }

  var interval = window.setInterval(function(data) {
    cb(data, interval);
  }, timeout || 0, data);

  return interval;
};

var myInterval = window.createInterval(function(data, interval) {
  document.write(data + " " + interval + " " + myInterval);
  window.clearInterval(interval);
}, 1000, "Hello");


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,