fud*_*din 15 javascript jquery
考虑以下正在执行的功能,
function loadPage()
{
takeInput();
processInput();
outputInput();
}
Run Code Online (Sandbox Code Playgroud)
它们将按什么顺序执行(我已经读过它跟随堆栈,所以选项2将是答案)?
选项1
选项#2
Hal*_*yon 16
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();
Run Code Online (Sandbox Code Playgroud)
小智 5
Javascript 不是异步的。
它同步工作,即一次运行一行代码。当 javascript 代码运行时,首先创建一个全局执行上下文,如果你从全局执行上下文调用一个函数,另一个执行上下文由 javascript 引擎创建并放置在执行堆栈的顶部(全局执行上下文已经在堆栈中)并且如果从该函数内部调用另一个函数,则会创建另一个执行上下文并且堆栈大小不断增加。
因此,javascript 引擎一次一行地运行此代码,在该过程中,如果有任何事件/http 请求触发,浏览器会将它们放入EVENT QUEUE。因此,关键是 javascript 引擎不会在执行堆栈为空之前处理队列中的事件。当引擎处理完执行堆栈时,它会定期查看队列中是否有当前事件的任何事件处理程序,并类似地为该处理程序创建执行上下文并运行其中的代码。所以,整个过程只是同步的,异步只是由浏览器的其他部分(如渲染引擎或 http 引擎)处理,而 javascript 引擎继续同步运行代码。
因此,在您的情况下,无论调用哪个上下文函数loadpage,都会创建其执行上下文并将其放置在堆栈顶部。然后,它调用takeinput函数,即它的 exec。上下文被创建,并且其他函数上下文不会被创建并放置在堆栈中,直到 takeinput 上下文从执行堆栈中弹出。因此,正确的顺序将是 takeinput、processinput 和 outputinput。
我希望它能回答你的问题。
| 归档时间: |
|
| 查看次数: |
7921 次 |
| 最近记录: |