分析JS单线程异步io回调的特性

我们最开始接触javascript应该大部分是从html中的js脚本开始,但是这种看似简单的语言稀里糊涂的用了好几年,也没有搞清楚它的一些原理机制,有没有躺枪!

起码javascript在操作dom的时候用了各种事件回调,比如按钮,链接的点击,鼠标经过,获取焦点等等.

在这个过程中,我们在dom上绑定一个事件回调函数 比如 onclick="doCheck()" 这个过程就是给dom元素注册了一个click 事件,并且绑定了一个事件回调函数 doCheck().

当鼠标点击这个元素的时候,触发了事件,马上执行事件绑定函数并回.

再后来是接触到jquery 的时候,大量的

$("#id").click(function(){
alert('点击事件');
});

这种jquery的语法写的越来越多似乎已经习惯了,但是你是都留意过前面的选择器只是选择过滤dom节点,接着的click就是一个事件注册,而里面的 function(){} 其实是一个参数,事件绑定函数的参数,这里面就要求你熟悉javascript的语法了.

function在javascript中是一个对象,对象就可以指世界的万事万物,所以对象可以包含很多属性,方法等.

既然是对象,那就可以当做一个参数去传递,这种函数叫做 高阶函数.

而且这种函数没有定义名称对不对,当然你可以一个名称,然后把名称传过来也是一样的,但是没有意义,因为这里的函数对象其实是一个形参,所以我们习惯的不给这种函数起名字,这就是常说的匿名函数.

接着上面的$("#id").click 说起,当点击事件被触发时,就要执行事件绑定函数.和上面直接在dom上给定onclick方法是一样的效果.

假设浏览器里有多个线程去操作脚本的话,你能想象到他的乱吗? 线程一正要去修改元素A的value值,结果没想到线程二已经把元素A从dom树删除节点,这时线程一只好操作失败报错.这样的情况是不糟透了,要么浏览器无维护多个线程数据的一致性,要么前端工程师自己去维护,所以......浏览器只有一个线程去操作dom,这样省去了很多不必要的麻烦.

setTimeout(function(){
alert('弹出');
},300);

while(true){
	........
}

你觉得 300毫秒后 alert('弹出') 还有戏吗?

没有了,永远没有戏了,等待300毫秒只是骗取你的感情的.因为浏览器是单线程模式执行脚本.

一旦线程处于死循环模式下去执行 while 语句,你的setTimeout 再也不会起任何作用了.

进而我们走入了 node.js 世界,它完全保留了javascript在浏览器的特性,单线程异步回调,也正是因为这个特点它才是它,假如node.js 是一门同步语言,就算所有的npm包都是 c++ 扩展的(速度够快吧)再快你也比不过c语言处理速度是不是,那么node.js可能还没有出世就已经被php鄙视了.

正是因为它的异步回调IO,更能提高他的效率,让我想起以前学校的一种快餐店和学校食堂的对比情况:

食堂是所有学生拿着盘子在窗口排成一字型队,打饭的妹妹一个一个盛好了,挨个端上饭走了.这是同步处理结果.

学校快餐店也是学生排队点餐,但是点完餐拿上你的呼叫器就可以离开找位置去了.这样单位时间内服务员可以为很多人提供服务,而且点好餐的同学可以找位置做自己其他事情,而不用傻傻地站到窗口等饭,直到你的饭出来的那一刹那,服务器会根据单号按下编码,这时你桌上的呼叫器会响起,你去取餐就好了.这是异步处理.那个呼叫器响起就是触发事件.

单线程可以减少多线程之间状态切换引起的资源浪费和维护困难,当然也有专门的第三方包来支持多核多线程的情景,你可以自己权衡.

以上就是关于JS单线程回调的全部信息内容,如有大家在学习的时候还有其他的疑问,可以在下面的留言区域讨论。

(0)

相关推荐

  • 分析JS单线程异步io回调的特性

    我们最开始接触javascript应该大部分是从html中的js脚本开始,但是这种看似简单的语言稀里糊涂的用了好几年,也没有搞清楚它的一些原理机制,有没有躺枪! 起码javascript在操作dom的时候用了各种事件回调,比如按钮,链接的点击,鼠标经过,获取焦点等等. 在这个过程中,我们在dom上绑定一个事件回调函数 比如 onclick="doCheck()" 这个过程就是给dom元素注册了一个click 事件,并且绑定了一个事件回调函数 doCheck(). 当鼠标点击这个元素的时

  • Node.js 的异步 IO 性能探讨

    Python 和 Ruby 也有这样的框架,但因为在实际使用中会不可避免地用到含有同步代码的库,因此没能成长起来,而在 Node.js 之前,JavaScript 的服务器端编程几乎是空白,所以 Node.js 才得以建立起了一个所有 IO 均为异步的代码库. 大部分 Web 应用的瓶颈都在 IO, 即读写磁盘,读写网络,读写数据库.使用怎样的策略等待这段时间,就成了改善性能的关键点. PHP 的策略:多进程运行,直接原地等待 IO 完成.缺点:多个进程会消耗多份内存,进程间难以共享数据. C/

  • python中使用asyncio实现异步IO实例分析

    1.说明 Python实现异步IO非常简单,asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO. 2.实例 import asyncio @asyncio.coroutine def wget(host): print('wget %s...' % host) connect = asynci

  • Node.js基础入门之回调函数及异步与同步详解

    目录 回调函数 1. 什么是回调函数? 2. 回调函数实现机制 3. 回调函数用途 4. 回调函数示例 异步与同步 1. 什么是异步与同步? 2. 同步示例 3. 异步示例一 4. 异步示例二 异步的实现 1. 回调函数的同步示例 2. 异步事件示例 3. 异步示例截图 Promise基础 1. 什么是Promise ? 2. Promise特点 3. 异步的缺点 4. Promise保证异步顺序 经过前面两天的学习,已经对Node.js有了一个初步的认识,今天继续学习其他内容,并加以整理分享,

  • 深入浅析Node.js单线程模型

    Node.js采用 事件驱动 和 异步I/O 的方式,实现了一个单线程.高并发的运行时环境,而单线程就意味着同一时间只能做一件事,那么Node.js如何利用单线程来实现高并发和异步I/O?本文将围绕这个问题来探讨Node.js的单线程模型: 1.高并发 一般来说,高并发的解决方案就是多线程模型,服务器为每个客户端请求分配一个线程,使用同步I/O,系统通过线程切换来弥补同步I/O调用的时间开销,比如Apache就是这种策略,由于I/O一般都是耗时操作,因此这种策略很难实现高性能,但非常简单,可以实

  • 深入理解Node.js 事件循环和回调函数

    本文详细的介绍了Node.js 事件循环和Node.js回调函数,废话不多说了,具体看下面把.  一.Node.js 事件循环 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高.Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发.Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现.Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观

  • 浅谈Node 异步IO和事件循环

    前言 学习Node就绕不开异步IO, 异步IO又与事件循环息息相关, 而关于这一块一直没有仔细去了解整理过, 刚好最近在做项目的时候, 有了一些思考就记录了下来, 希望能尽量将这一块的知识整理清楚, 如有错误, 请指点轻喷~~ 一些概念  同步异步 & 阻塞非阻塞 查阅资料的时候, 发现很多人都对 异步和非阻塞 的概念有点混淆, 其实两者是完全不同的, 同步异步指的是 行为即两者之间的关系 , 而阻塞非阻塞指的是 状态即某一方 . 以前端请求为一个例子,下面的代码很多人都应该写过 $.ajax(

  • 深入分析node.js的异步API和其局限性

    用异步API的原因 异步的概念之所以首先在Web2.0中火起来,是因为在浏览器中Javascript在单线程上执行,而且他还与UI渲染公用一个线程.这意味着Javascript在执行的时候UI渲染和响应是处于停滞状态的.为了用户体验更好而采取异步的方式(当然,这在所谓的单线程语言中)不阻塞主线程继续响应用户操作.这属于用户体验的范畴. 同样的,如果有其他语言经验的工程师当然也明白,CPU在线程间切换是需要消耗大量的时间的(主要为上下文之间的切换和缓存),所以提高效率也是使用异步API的理由. 当

  • 浅谈js的异步执行

    1.Javascript语言的执行环境是"单线程"(single thread): 优点:实现起来比较简单,执行环境相对单纯: 缺点:只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行.常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行. 为了解决这个问题,Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous). 2.&

  • node.js基于socket.io快速实现一个实时通讯应用

    随着web技术的发展,使用场景和需求也越来越复杂,客户端不再满足于简单的请求得到状态的需求.实时通讯越来越多应用于各个领域. HTTP是最常用的客户端与服务端的通信技术,但是HTTP通信只能由客户端发起,无法及时获取服务端的数据改变.只能依靠定期轮询来获取最新的状态.时效性无法保证,同时更多的请求也会增加服务器的负担. WebSocket技术应运而生. WebSocket概念 不同于HTTP半双工协议,WebSocket是基于TCP 连接的全双工协议,支持客户端服务端双向通信. WebSocke

随机推荐