![](/img/trans.png)
[英]Calling a function when using setTimeout() and setInterval() in JavaScript
[英]How to write a factorial function in Javascript using setTimeout or setInterval
幾周前,我問了一個關於使用setTimeout進行析乘功能的問題,但是不幸的是,它使用的是未注冊帳戶,我從未得到完整的答案。
我的主要問題是,我想編寫一個函數來計算數字的階乘,但使用setTimeout或setInterval命令。 其背后的推動力是重置IE使用的計數器,以避免長時間運行的腳本警告。 目前,我的階乘函數為:
function factorial(n) {
return 0 === n || 1 === n ? 1 : n * factorial(n - 1)
}
在我的另一篇文章中,jsumners很友好,可以為我提供嘗試在計算階乘時定期使用setTimeout的代碼:
function factorial(x) {
executions++;
if (x > 1) {
if (executions % 20 === 0) {
return (function() {
var y = x;
setTimeout(function(y) { return y*factorial(y-1); }, 1);
});
} else {
return x*factorial(x-1);
}
} else {
executions = 0;
return 1;
}
}
在上面的代碼中,當經過的執行次數是20的因數(模數20)時,理論上應該使用setTimeout命令執行下一個乘法。 不幸的是,該代碼無法正常工作,發生的事情是,如果嘗試計算大於20的數字的階乘,則結果為NaN。 如果數字小於20,則答案是正確的。
有人知道使用setTimeout或setInterval命令來計算階乘的這種方法或其他方法的解決方案嗎?
謝謝!
這是因為您將y
指定為參數,該參數在執行時由於未傳入而undefined
,因此可以通過更改此參數來對其進行修復:
setTimeout(function(y) { return y*factorial(y-1); }, 1);
對此:
setTimeout(function() { return y*factorial(y-1); }, 1);
但是,它仍然是NaN
因為在這里:
return (function() {
var y = x;
setTimeout(function() { return y*factorial(y-1); }, 1);
});
您仍在返回一個函數 ,而不是一個可以相乘的數字,因此仍然不能以這種方式使用setTimeout()
。 您可以傳遞在完成所有操作后執行的回調,但是您不能讓它遞歸並返回到這樣的調用方。
通過setTimeout安排的每個循環步驟的回調樣式階乘為:
// private helper function (recurrency with accumulation)
function _factorial(acc, n, callback){
if(n==0){
callback(acc);
}else{
var callback_wrapper = function(result){
callback(result);
};
setTimeout(function(){_factorial(acc * n, n-1, callback_wrapper)}, 10);
}
}
// public function
function factorial(n, callback){
_factorial(1, n, callback);
}
// usage example
factorial(10, function(result){console.log(result)});
-干杯,Lambder
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.