在我创建一个间隔的javascript中,我想从函数内部停止间隔,但我不想像这样从外部引用ID值
var y = setInterval(function(){ clearInterval(y); }, 1000);
我想要的是传递一个类似于这种风格的变量
setTimeout(function(data){alert(data);}, 1000, "data");
这也适用于setInterval,除了我无法真正传递setInterval函数返回的id值,因为它是在调用它之后创建的。
现在我正在做这样的黑客攻击:
var r = [];
var y = setInterval(function(r){ if (r.length==1) { clearInterval(r[0]); } }, 1000, r);
r.push(y);
有没有人知道正确的方法?
由于
答案 0 :(得分:4)
您必须使用返回值,但这并不意味着该变量需要对其他任何内容都可访问;只是封装:
(function() {
var y = setInterval(function(){ clearInterval(y); }, 1000);
})();
上面的 y
只能 在外部匿名函数中可访问,该函数只有interval函数而且没有其他内容。
您甚至可以给自己一个可重复使用的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) {
snippet.log("Interval callback called, handle is " + handle + ", args are '" + arg1 + "' and '" + arg2 + "'");
if (++counter > 5) {
clearInterval(handle);
}
}, 500, "a", "b");
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
答案 1 :(得分: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(与myInterval相同)
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");