通过alert方法,去理解js中阻塞、局部作用域、同步/异步任务

时间: 2018-01-12阅读: 4972标签: 异步

JavaScript中alert是Bom中的成员函数,BOM是以window对象为依托,代表浏览器窗口和页面的可见区域等,也就是说alert()实际上是window.alert()。


alert的对话框是模态的。对话框一般分为两种:模态和非模态,模态对话框:就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话框。非模态对话框则不会强制此种特性,用户可以在当前对话框以及其他窗口间进行切换。显然window.alert函数弹出的对话框是模态的,具有阻塞性质的,不点击是不会执行后续代码的。我们可以创建模态对话框与非模态对话框的相关语法

//创建模态对话框: 
window.showModalDialog(sURL [, vFreeArgument] [, sOrnaments]); 
//创建非模态对话框: 
window.showModelessDialog(sURL [, vFreeArgument] [, sOrnaments]);


js的阻塞是指在调用结果返回之前,当前线程会被挂起, 只有在得到结果之后才会继续执行,例如以下代码不关闭alert,永远不会输出1。

alert("不关闭后面是不会执行的");
console.log(1);


已经知道alert()是阻塞式的,但是在定时器中会出现代码执行顺序的问题,例如:

(()=>{
    for(let i = 0; i < 5; i++){
        setTimeout(() => alert(i), 1000);
    }
})();

这里使用了let局部作用域,确保了输出结果不会每次都为5(改为var后,setTimeout在1秒后主线程是循环完成了的,i的值以及变为5了,就会造成结果一直为5)。我们会发现除了第一弹窗是0以外,后面的并没按顺序执行,如果把alert改为console.log(i)就可以按顺序输出。这是为什么呢?

首先js是一个单线程的,意味着所有任务都需要排队,等前一个任务结束才会执行后一个任务。在js中任务分为2类:同步任务和异步任务

同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务:不进入主线程、而进入"任务队列"的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。  

setTimeout方法是异步任务, 它向“任务队列”依次添加执行函数。所以在alert 0的时候,不去点确定,主线程是被挂起的状态,如果在1秒内点确定会发现顺序就是是正常的,这是由于取消alert阻塞后"任务队列"为2的刚好进入主线程。如果很久才去点击确定,“任务队列”都进入主线程了,那么js会采用轮询再来处理剩下未执行的代码




站长推荐

1.阿里云: 本站目前使用的是阿里云主机,安全/可靠/稳定。点击领取2000元代金券、了解最新阿里云产品的各种优惠活动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各类产品的最新活动,优惠券领取点击进入

3.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/349

javascript如何实现异步请求?

JS中通常实现浏览器和服务器的数据交互,那么异步操作是关键的一部分:通常情况下,浏览器想服务器发送请求,服务器相应请求返回数据,浏览器执行异步操作。

解读react的setSate的异步问题

将setState()认为是一次请求而不是一次立即执行更新组件的命令。为了更为可观的性能,React可能会推迟它,稍后会一次性更新这些组件。React不会保证在setState之后,能够立刻拿到改变的结果。

异步的JavaScript

JS本身是一门单线程的语言,所以在执行一些需要等待的任务(eg.等待服务器响应,等待用户输入等)时就会阻塞其他代码。如果在浏览器中JS线程阻塞了,浏览器可能会失去响应,从而造成不好的用户体验。

Js如何处理循环的异步操作

compute.exec()这是个异步方法,在里面处理一些实际业务,这时候打印出来的很可能就是300,300,300(因为异步for循环还没有等异步操作返回Promise对象过来i值已经改变)

Nodejs 处理异步(获取异步数据并处理)的方法

回调函数方式:将异步方法如readFile封装到一个自定义函数中,通过将异步方法得到的结果传给自定义方法的回调函数参数。事件驱动方式:使用node events模块,利用其EventEmitter对象

理解Javascript的异步

Javascript是单线程的编程语言,单线程就是说同一时间只能干一件事。放到编程语言上来说,就是说Javascript引擎(执行Javascript代码的虚拟机)同一时间只能执行一条语句。单线程语言的好处是你只管写不用担心并发问题。

js处理异步的几种方式

回调函数易造成回调函数地狱,回调函数中嵌套多个回调函数,因为多个异步操作造成强耦合,代码乱做一团,无法管理。事件监听使用不方便,每次都要手动地绑定和触发事件

总结异步编程的六种方式

众所周知 JavaScript 是单线程工作,也就是只有一个脚本执行完成后才能执行下一个脚本,两个脚本不能同时执行,如果某个脚本耗时很长,后面的脚本都必须排队等着,会拖延整个程序的执行

前端异步是什么?哪些情况下会发生异步?

这里就不拿官方的解释来解答了,只以个人理解来回答问题,轻喷。我们知道JavaScript是单线程的,不像java等语言是多线程的,所以一般情况下,js代码是一行一行的执行的。但是某些时候需要用异步来提升性能

解决Js异步回调的深层嵌套的3种方式

问题:解决异步回调的深层嵌套的问题.(回调地狱),promise对象用于表示一个异步操作的最终状态,promise在回调代码和将要执行这个任务的异步代码之间提供了一种可靠的中间机制来管理回调。

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广