Javascript 从函数';s以for循环返回?

Javascript 从函数';s以for循环返回?,javascript,Javascript,让我们举个例子: function test(i, total) { return total + i * 100 / 999 * -124 / 333; } var total = 0; for (var i = 0; i <= 100; i++) { total = test(i, total); console.log(total); } 功能测试(一,总计){ 返回总数+i*100/999*-124/333; } var合计=0; 对于(var i=0;i

让我们举个例子:

function test(i, total) {
    return total + i * 100 / 999 * -124 / 333;
}
var total = 0;
for (var i = 0; i <= 100; i++) {
    total = test(i, total);
    console.log(total);
}
功能测试(一,总计){
返回总数+i*100/999*-124/333;
}
var合计=0;

对于(var i=0;i这是因为JavaScript是单线程的。您的代码是单线程的。

函数调用在JavaScript中是同步的和单线程的。这取决于语言设计。当您从循环中调用
test
函数时,循环将等待函数返回

调用
setTimeout
时,它会创建一个计时器并立即返回。它不会等待计时器被触发(即使是第一次)。计时器是异步触发的

有关更多信息,请参阅并阅读

“如果测试函数需要3秒钟才能返回,为什么循环要等待 这是不是因为测试中没有异步特性 功能?”

没错。函数的执行在Javascript中是同步的,就像在几乎所有其他语言中一样。执行是沿着一条路径完成的,因此当您调用函数时,它将在返回之前完成,调用后的代码可以继续

如果在函数中使用异步代码(例如使用
setTimeout
),则异步代码将被搁置,直到其余代码执行完毕,浏览器重新获得控件,因为Javascript是单线程的

如果在循环中调用
test
101次,并且每次都使用
setTimeout
,那么在循环完成时,有101段代码等待运行。这101段代码直到循环完成后才能运行。作为乐趣,您保留的代码不能提供从函数返回的值Action在代码运行之前返回

要异步运行代码,您将使用在函数完成时调用的回调。示例:

function test(i, callback) {
  window.setTimeout(function(){
    var result = i * 100 / 999 * -124 / 333;
    callback(result);
  }, 1000);
}

var total = 0;
var resultCount = 0;
for (var i = 0; i <= 100; i++) {
  test(i, handleCallback);
}

function handleCallback(value) {
  total += value;
  resultCount++;
  if (resultCount == 101) {
    console.log(total);
  }
}
函数测试(i,回调){
setTimeout(函数(){
var结果=i*100/999*-124/333;
回调(结果);
}, 1000);
}
var合计=0;
var resultCount=0;
for(var i=0;JavaScript中的i调用是阻塞的,但JavaScript没有阻塞等待/睡眠方法,而是使用非阻塞回调来实现该.Logic。