我对setTimout
有疑问。
为了理解我的观点,我们举一个例子:
function f(callback)
{
var i = 0;
while(true)
{
++i;
if(i == 2000000000) break;
}
callback();
}
function g()
{
f(function(){console.log("CALLBACK");});
console.log("FIRST HERE");
}
g();
console.log("SECOND HERE");
所以我们在这里,(即使代码在函数callback
中具有f
的异步样式),f
中的while循环首先被执行,&# 34; CALLBACK"打印,然后"第一个在这里"打印,然后是" SECOND HERE"。即使乍一看我们认为由于callback
中传递的f
函数而异步,此代码也会以同步方式运行。
现在让我们看另一个例子:
function f(callback)
{
setTimeout(function(){
var i = 0;
while(true)
{
++i;
if(i == 2000000000) break;
}
callback();
});
}
function g()
{
f(function(){console.log("CALLBACK");});
var i = 0;
while(true)
{
++i;
if(i == 2000000000) break;
}
console.log("FIRST HERE");
}
g();
console.log("SECOND HERE");
现在f
内的代码封装在setTimeout
内。这里一切都在变化。 setTimout
没有等待时间的第二个论点。所以通常现在应该执行代码(尽快)。但是这里" FIRST HERE"和#34;第二次在这里"首先打印,然后仅打印(在f
中执行while循环之后),执行setTimout
内的代码,然后执行" CALLBACK"打印出来。所以我们可以观察到,即使f
中的代码现在应该被执行,它也只是在执行#34; main "执行块(在setTimout
内)的代码。
所以这是我的问题。 javascript如何处理setTimeout
或setInterval
?在该示例中,我们观察到代码不会立即执行(或在第二个参数中指定的特定时间)。它仅在javascript有空闲时间后执行(执行主代码后)。那么javascript如何实现这种行为呢?可能有一个优先级堆栈(setTimout
的第二个参数的优先级),它在内存中保存了必须在setTimout
中调用的函数。一旦javascript有空闲时间,他就会在调用函数之前推断出等待的时间,并在时间结束后调用它们。
我只做了一些假设。所以我想确切地知道javascript是如何工作的以及setTimout/setInterval
如何在幕后工作。
另一个问题是:是否所有异步函数都是基于setTimout
实现的,以创建异步行为?即事实上,代码是在"类型的"中执行的。 parallel(javascript有时间执行代码)。例如fs.readFile('/etc/passwd', 'utf8', callback);
如何运作?
var fs = require('fs');
fs.readFile('/etc/passwd', 'utf8', function(){
console.log("ICI")
});
var i = 0;
while(true)
{
++i;
if(i == 2000000000) break;
}
console.log("LA");
在那个例子中,我们看到所有的while循环都被执行了然后" LA"印刷后和#34; ICI"打印出来。因此,当javascript与setTimout
之前的案例无关时,执行异步调用。