Javascript事件驱动系统中异步性背后的原因是什么
请帮助我理解这一点 您有一个调用几个方法的函数:Javascript事件驱动系统中异步性背后的原因是什么,javascript,asynchronous,callback,event-driven,Javascript,Asynchronous,Callback,Event Driven,请帮助我理解这一点 您有一个调用几个方法的函数: function() { methodA(function(){...}); methodB(); methodC(); } 从没有回调或匿名函数的语言中,我习惯了这样一个事实,即直到方法返回,执行才会继续 因此,如果我使用回调调用methodA,那么执行将不得不等到方法返回时,这不是异步的,对吗 因此,例如,我可以存储对某个对象的回调,并让methodA返回。然后执行methodB和methodC。当用户单击按钮时,某个处理
function() {
methodA(function(){...});
methodB();
methodC();
}
从没有回调或匿名函数的语言中,我习惯了这样一个事实,即直到方法返回,执行才会继续
因此,如果我使用回调调用methodA,那么执行将不得不等到方法返回时,这不是异步的,对吗
因此,例如,我可以存储对某个对象的回调,并让methodA返回。然后执行methodB和methodC。当用户单击按钮时,某个处理程序执行回调
我得出的结论是,与java或python相比,javascript并没有异步性(不涉及多线程)。。。。因为在java中,回调不是闭包/匿名方法,而是一个带有“execute”方法的对象,它将完全相同,只是稍微复杂一点。。。当然,有一个特定于DOM的JS事件系统
function main() {
methodA(function callback(){...});
methodB();
methodC();
}
假设回调没有立即执行
执行命令:
- 方法
- 方法B
- 方法C
- 。。。其他东西,直到堆栈为空
- 回拨
- JavaScript中的回调不会隐式添加异步行为。当调用回调函数时,它会立即运行,就像普通函数一样。(实际上,回调函数只是一个普通函数…)
因此,无法确定本例中回调的执行何时将与其他方法相关联地运行(除了调用
methodA
之前不能运行之外)——可以从methodA
或methodB
或稍后单击调用,也可以根本不调用。(但是,除非存在异常——或者其中一个函数调用了另一个函数——否则methodA
将在methodB
之前运行,而methodC
将在methodC
之前运行;如果methodA
引发异常,则不会调用methodB
或methodC
)
添加异步行为的是异步事件源,如计时器事件或UI操作,如按钮单击
但是,重要的是要记住,Javascript没有或不支持线程。在触发新的异步事件之前,Javascript必须“停止”(执行必须从异步事件源调用的回调函数返回)。(异步事件(视情况而定)排队,以便在另一个回调执行时间过长时不会“丢失”计时器事件。)
这就是为什么while(true){}
将使浏览器页面冻结并阻止处理按钮事件处理程序的原因
快乐编码
示例案例():
函数invokeNow(回调){
//这里没发生什么事。
//此时将调用回调并返回结果。
返回回调()
}
警报(invokeNow(函数(){return“Hello world!”}))
函数doLater(回调){
//设置异步事件
设置超时(回调,1000)
return“现在还不是‘晚’!”
}
警报(数据记录器(功能)(){
警报(“稍后!”)
//请注意,这是在上一个函数的回调中运行的
//计时器事件。如果此代码低于外部警报,则
//它不会允许第一次计时器回调发生
//直到阻塞完成
警报(doLater(函数(){alert(“我仍然在运行!”)}))
变量结束=(+新日期)+4000
而((+新日期)
警告:Firefox4(4.0.1)和上面的代码似乎有问题。虽然其工作原理如所示,但如果超时时间低于约800毫秒,则预期顺序与实际顺序不同。我已经发布了,希望会有一些解决方案。该行为在Firefox 3、IE 9和Chrome 11中正常工作。Javascript是连续的,除非您使用
setInterval
、setTimeout
,或者通过回调或使用onload向服务器发出请求。我不确定还有其他情况
如果您有以下情况:
function methodA(fn){
...
fn();
}
然后,当您调用methodA(function(){…})
时,将调用回调。这不是真的。methodA可以立即调用传递给它的函数。请指定堆栈包含什么?你是说堆栈只在函数范围内?当函数返回或结束时调用回调?或者即使在函数返回后也可以执行回调?@Edgar堆栈包含main之后执行的任何内容,直到没有更少的内容可执行为止。这只是一种可能性,最有可能的情况是,但除非我们知道methodB
和methodC
做什么,否则无法保证顺序。回调可以放入全局范围,然后通过methodB
或methodC
执行。
function methodA(fn){
...
fn();
}