Javascript 如何在递归中使用setTimeout以避免浏览器陷入复杂进程

Javascript 如何在递归中使用setTimeout以避免浏览器陷入复杂进程,javascript,recursion,cpu-usage,single-threaded,Javascript,Recursion,Cpu Usage,Single Threaded,我有这样一段代码,它使用了一个消耗大量内存的低效进程(): 我的目标是使用某种setTimeout(function(){…},0)技术,这样浏览器在执行代码时就不会卡住 如何更改代码,使其与setTimeout一起工作? function powerOfTwo(num) { inefficientProcess(); if (num > 0) { return powerOfTwo(num-1)*2; } else { return

我有这样一段代码,它使用了一个消耗大量内存的
低效进程()

我的目标是使用某种
setTimeout(function(){…},0)
技术,这样浏览器在执行代码时就不会卡住

如何更改代码,使其与setTimeout一起工作?

function powerOfTwo(num) {
    inefficientProcess();
    if (num > 0) {
        return powerOfTwo(num-1)*2;
    } else {
        return 1;
    }
}

function inefficientProcess() {
    var sum;
    for (var i=0; i < 500000; i++) {
        sum+=10;
    }
}

powerOfTwo(1000);
函数powerOfTwo(num){
无效流程();
如果(数值>0){
返回功率为2(num-1)*2;
}否则{
返回1;
}
}
函数无效进程(){
var和;
对于(变量i=0;i<500000;i++){
总和+=10;
}
}
powerOfTwo(1000);

当然,我的目标是学习如何在执行繁重的计算时避免浏览器崩溃。

Javascript是单线程的,所有代码都是阻塞的。 HTML5中有一个新标准WebWorkers API,它允许您将任务委托给不同的线程。然后,您可以传递一个回调函数来执行结果

简单的例子:

function powerOfTwo(num, callback) {
    var worker = new Worker('inneficient.js');
    worker.postMessage('runTask');
    worker.onmessage = function(event) {
        var num = event.data.result;
        var pow;
        if (num > 0) {
            pow = Multiply(num-1)*2;
        } else {
            pow = 1;
        }
        callback(pow);
    };    
}

powerOfTwo(1000, function(pow){
    console.log('the final result is ' + pow);
});
在innficient.js中,您可以看到如下内容:

//infecient.js

function inefficientProcess() {
    var sum;
    for (var i=0; i < 500000; i++) {
        sum+=10;
    }
     postMessage({ "result": sum});
}

inefficientProcess();
功能无效流程(){
var和;
对于(变量i=0;i<500000;i++){
总和+=10;
}
postMessage({“result”:sum});
}
无效流程();

正如Andre在回答中提到的,有一个新的HTML5标准,允许您在不同的线程上启动任务。否则,您可以调用时间为0的setTimeout,以允许在调用低效进程之前完成当前执行路径(以及可能要呈现的一些UI更改)

但是,无论您是否可以使用HTML5,powerOfTwo函数都必须更改为异步函数——无论谁调用它,都需要提供一个回调方法,当(a)通过WebWorkers旋转的线程返回时,或者(b)setTimeout方法完成时,将调用该回调方法

编辑以添加示例:

function powerOfTwo(num, callback)
{
    setTimeout(function ()
    {
        inefficientProcess();
        if (num > 0)
            callback(Multiply(num-1)*2);
        else
            callback(1);
    }, 0);
}

function inefficientProcess() { ... }
HTML元素允许您定义JavaScript 页面中的代码应该开始执行。“异步”和“延迟” 九月初,属性被添加到WebKit。Firefox已经被广泛使用 已经支持他们很久了


看到这个了

所以…你在问如何打破
低效流程中的循环
,这样它只会在短时间内阻塞?你的问题是什么?能给我举个例子吗?我真的需要一些代码来理解如何处理这个问题
函数powerOfTwo(num,callback){setTimeout(function(){lofficeprocess();if(num>0){callback(Multiply(num-1)*2);}else{callback(1);},0);}函数lofficeprocess(){var sum;for(var i=0;i<500000;i++){sum+=10;}}
如何触发此函数?powerOfTwo(100,whatgoesher)?另一个函数名放在那里。在Javascript中,函数被视为其他任何对象,因此您可以传入其他函数的名称作为回调:
powerOfTwo(100,callbackFunctionName)
。或者您可以传入一个匿名函数(如我在示例中传入setTimeout的函数)。