考虑正在执行以下函数,
function loadPage()
{
takeInput();
processInput();
outputInput();
}
它们将以什么顺序执行(我已经读过它遵循堆栈,所以选项 2 将是答案)?
选项1
- 采取输入();
- 进程输入();
- 输出输入();
选项#2
- 输出输入();
- 进程输入();
- 采取输入();
考虑正在执行以下函数,
function loadPage()
{
takeInput();
processInput();
outputInput();
}
它们将以什么顺序执行(我已经读过它遵循堆栈,所以选项 2 将是答案)?
选项1
选项#2
JavaScript 函数不是异步的。一些非常有限的函数集具有异步 API:
addEventListener
, setTimeout
, setInterval
. 这些是仅有的 3 个(我认为这非常令人惊讶)。
它们允许您传入最终可能会被调用的回调。例如,当计时器到期时,或者当用户点击某物时,或者当 AJAX 请求完成时。
JavaScript 有一个事件循环。事件循环会在每个事件进入时对其进行处理。如果您单击按钮 3 次,然后计时器到期,这也是处理事件的顺序。这一切都非常明确和确定。
此外,JavaScript 没有线程,它完全运行一个事件,直到在开始下一个事件之前没有任何事情要做(你返回)。所以事件永远不会以任何方式干扰。这使您可以对数据的状态做出非常强有力的假设。
JavaScript 函数是异步的吗?
有些是,大多数不是。
他们将按什么顺序执行
它们将按照它们被调用的顺序执行。因为它们都是从同一个函数中调用的,所以这将是一个简单的线性顺序。
如果它们中的任何一个是以异步方式编写的,那么它们可能不会以相同的顺序完成所有活动。例如:_
function a() {
console.log('a');
}
function b() {
console.log('b');
}
function c() {
console.log('c');
}
function aAsync() {
setTimeout(a, 500);
}
function load() {
aAsync();
b();
c();
}
load();
Javascript 不是异步的。
它同步工作,即一次运行一行代码。当 javascript 代码运行时,首先创建一个全局执行上下文,如果您从全局执行上下文调用一个函数,另一个执行上下文由 javascript 引擎创建并放置在执行堆栈的顶部(全局执行上下文已经在堆栈中)并且如果从该函数内部调用另一个函数,则会创建另一个执行上下文并且堆栈大小不断增加。
因此,javascript 引擎一次一行地运行此代码,并且在该过程中,如果有任何事件/ http 请求触发,浏览器会将它们放在EVENT QUEUE中。所以,关键是javascript引擎不会处理队列中的事件,直到执行堆栈为空。当引擎完成执行堆栈时,它会定期查看队列中是否有当前事件的任何事件处理程序,并类似地为该处理程序创建执行上下文并运行其中的代码。因此,整个过程只是同步的,异步只是由浏览器的其他部分(渲染引擎或 http 引擎)处理,而 javascript 引擎继续同步运行代码。
因此,在您的情况下,无论从哪个上下文函数loadpage被调用,它的执行上下文都会被创建并放置在堆栈的顶部。然后,它调用takeinput函数,它的 exec。context 被创建,并且其他函数 context 不会被创建并放入堆栈中,直到从执行堆栈中弹出 takeinput 上下文。因此,正确的顺序将是 takeinput、processinput 和 outputinput。
我希望它能回答你的问题。
JavaScript 通常不是异步的,但它确实具有异步和事件驱动的方法。
Ajax 调用是主要的异步方法。
对于事件,我不确定您是否可以保证执行顺序,但我可能错了。
Javascript 是一个单线程的野兽,所以严格来说,任务并不是像人们想象的那样是异步的,因为它会产生子线程来执行代码。提供这种机制的机制会产生异步的错觉,但它仍然是单线程的。
不,不是默认/标准,尽管有异步方法。jQuery 更多地利用了异步行为。但在每种情况下,它都是主观的,不能说“所有的 JavaScript 都是这个或那个”。
方法总是按照它们被调用的顺序执行;它们的异步性意味着任何一个都可以在另一个之前完成,即使是在之后调用。