通过setTimout调用自身的函数会导致溢出吗?
Can a function that calls itself through setTimout lead to overflow?
给出这样的函数。 . .
function self_time() {
console.log('hi');
setTimeout(self_time, 1000);
}
这会导致堆栈溢出吗?我知道这不完全是递归调用并且 javascript 是异步的,但是这样 运行 可以无限期地不耗尽资源吗?
还有像这样的 try-catch 情况呢。 . .
function try_it() {
try {
console.log('im trying something...');
} catch(e) {
//i failed so im going to try again in 1 second
setTimeout(try_it, 1000);
}
}
说函数无限期失败,它会 运行 资源不足吗?
我知道 setInterval 是另一种选择,但成功时这样的调用将不再需要间歇性地检查。
这两个函数都不会 运行 资源不足;实际上并没有发生递归,因为浏览器异步调用传递给 setTimeout
的函数。但是,您可以通过滚动自己的 attemptEvery
实用程序使您的逻辑更清晰一些,正如我在下面所做的那样:
function attemptEvery (ms, fn) {
var token = setInterval(function () {
try {
fn.apply(this, [].slice.call(arguments, 2))
clearInterval(token)
} catch (e) {}
}, ms)
}
attemptEvery(100, function () {
dangerousOperation()
console.log('Success!')
})
function dangerousOperation () {
console.log('Attempting dangerous operation!')
if (Math.random() < .6) throw Error()
}
给出这样的函数。 . .
function self_time() {
console.log('hi');
setTimeout(self_time, 1000);
}
这会导致堆栈溢出吗?我知道这不完全是递归调用并且 javascript 是异步的,但是这样 运行 可以无限期地不耗尽资源吗?
还有像这样的 try-catch 情况呢。 . .
function try_it() {
try {
console.log('im trying something...');
} catch(e) {
//i failed so im going to try again in 1 second
setTimeout(try_it, 1000);
}
}
说函数无限期失败,它会 运行 资源不足吗?
我知道 setInterval 是另一种选择,但成功时这样的调用将不再需要间歇性地检查。
这两个函数都不会 运行 资源不足;实际上并没有发生递归,因为浏览器异步调用传递给 setTimeout
的函数。但是,您可以通过滚动自己的 attemptEvery
实用程序使您的逻辑更清晰一些,正如我在下面所做的那样:
function attemptEvery (ms, fn) {
var token = setInterval(function () {
try {
fn.apply(this, [].slice.call(arguments, 2))
clearInterval(token)
} catch (e) {}
}, ms)
}
attemptEvery(100, function () {
dangerousOperation()
console.log('Success!')
})
function dangerousOperation () {
console.log('Attempting dangerous operation!')
if (Math.random() < .6) throw Error()
}