知乎大牛的关于JS解答
很多疑惑一扫而空。。。。
http://www.zhihu.com/question/35905242?sort=created
JS的单线程,浏览器的多进程,与CPU,OS的对位。
互联网移动的起起落落。。。
爽!!!
链接:http://www.zhihu.com/question/35905242/answer/65974599
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
### 第1个问题:为什么浏览器的开发语言是JavaScript?
因为JavaScript唯一的对手VBScript,是一个既不可以跨浏览器,也不可以跨平台,而且还很危险的浏览器开发语言。JavaScript则正好可以跨平台,还比较安全,而且V8引擎的推出也大大地改善了它的性能,并且可以不依赖浏览器运行,尽管它有很多缺点,但问题是我们没有其他更好的选择。
### 第2个问题:为什么JavaScript被设计成单线程的?
因为JavaScript出生的时候,CPU和OS都不支持多线程,浏览器单进程在运作,渲染线程、JavaScript线程、网络线程等多个线程已经需要排队才能处理了,这种情况下如果将JavaScript设计成多线程有意义吗?考虑到当时的项目需求(运行在浏览器上)、周期(10天)、硬件环境以及软件环境等因素,换作其他人也都会将JavaScript设计成单线程的!
### 第3个问题:为什么JavaScript没有设计成同步执行的?
因为当web应用需要在客户端和服务端之间进行反复交互时,异步才是更合理的设计。如果JavaScript在一开始被设计成同步的,那么后来它也会被改造成异步的,否则会又意外一个叫“异步JavaScript”来取代它。
### 第4个问题:为什么JavaScript会分主线程和消息线程(event loop) ?
这是一个错误的问题。到目前为止,在同一个页面进程中,JavaScript只有一个线程。可以分为主线程和消息线程的是浏览器进程。
### 第5个问题:为什么JavaScript可以表现出‘多线程’的特点?
这其实也是一个错误的问题,能够实现多线程的其实是浏览器进程,它至少有7个以上不同的线程,核心线程有两个,一是浏览器引擎线程,二是渲染引擎线程。而JavaScript引擎线程、网络请求线程、html解析线程、UI线程也都是渲染引擎线程的子线程。
消息线程(event loop) 其实是浏览器引擎线程一个表现。浏览器是事件驱动(Event driven),消息是事件的一种,此外还有很多,比如鼠标点击事件、窗口大小拖拉事件、定时器触发事件、XMLHttpRequest完成回调等等。
### 第6个问题:为什么浏览器是多进程的?
因为OS是多进程的,也就是Windows是多任务系统,不过开始的时候可不是这样子的,后来才被设计成这样的。就因为浏览器是运行在OS上面的,而OS又允许软件可以同时运行多个进程,所以浏览器就可以多进程。
### 第7个问题:为什么浏览器是多线程的?
这个问题没法回答,我真不知道为什么,一开始的时候它张成就这样的了。可能是因为单个线程完成不了显示页面这种高难度的活,于是浏览器就得设计成多个线程,即便CPU不支持多个线程也要设计成这个样子。
### 第8个问题:为什么JavaScript可否设计成多线程?
好问题!之前我说过了,JavaScript的单线程的设计是因为当时CPU硬件和OS软件等环境不允许,因此被设计成单线程的。但是后来的确有很多需求希望JavaScript可以实现多线程任务机制,好在它有异步机制,再结合浏览器的事件驱动设计,因而JavaScript也能模拟出多线程的效果。
这个问题页可以看看《JavaScript 运行机制详解》一文,阮一峰老师也又关于此问题的解答。他的解析是一种答案,但我并不是十分认可,因为“避免复杂性”这个论点其实说不通。对于普通人而言,程序本来都是复杂的,但对于程序员而言却不是,再复杂的程序都有人书写,不在于多一个多线程的JavaScript。
### 第9个问题:JavaScript什么时候实现原生的多线程支持?
这个问题我没能力回答,但可以预测。现在绝大多数编程语言都是支持多线程的了,我相信未来的JavaScript也应该演变成多线程语言,而且已经快了!在HTML5里面已经有类似的设计,已经提供类似多线程的Worker(请参考Introduction to HTML5 Web Workers),并且ECMAScript 2016已经在探讨JavaScript并行机制了。
### 第10个问题:在未来,会不会有一种新的语言取代JavaScript在浏览器上的位置?
这个问题我依然没能力回答,只能假设。假设有一种新的语言取代了JavaScript,原来那一大堆使用JavaScript编写的页面交互应用是不是要重构?根据我这几年从事前端开发以来的经验,一旦一个项目已经在线上跑起来了,彻底打翻重构是不太可能。即便未来又一门可运行在浏览器端的开发语言,那也是从新项目开始,而JavaScript会一直存在,最多就是两者并存。
因此,我认为JavaScript被取代的可能性几乎不存在,前端开发者不需要那么多开发语言,html、css和JavaScript这三者各司其职就已经够,它们就是Web页面的铁三角(三角形是最稳固的),多一个就乱了。
或许,有人说Facebook的jsx,拜托,这是 html+JavaScript 好吧!
知乎大牛的关于JS解答的更多相关文章
- js标签放在html的什么位置比较好
推荐的是js的script标签放在body的末尾,</body>标签之前,包含在body内! <body> <!--其它Html标签--> <script&g ...
- 关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用
关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用 工作环境:window下 在一切的最开始,安装node.js (中文站,更新比较慢http://nodejs.cn/) ...
- 深入js隐式类型转换
前言 相信刚开始了解js的时候,都会遇到 2 =='2',但是 1+'2' == '1'+'2'为false的情况,这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这 ...
- 你可能忽略的js类型转换
前言 相信刚开始了解js的时候,都会遇到 2 == '2',但 1+2 == 1+'2'为false的情况.这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这么猝不及 ...
- 【本周面试题】第2周 - js单线程和异步相关问题
硬性知识点考察: 为什么js是单线程的? 因为js设计最初是为了操作dom而生,如果是多线程的,当多个线程同时修改一个dom时就会产生冲突,所以设计成单线程,一次只能做一件事. 既然是单线程为什么要有 ...
- js的prototype(2)
1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展.我们称B的原型为A. 2 javasc ...
- web前端/移动端H5博客专家博客大全--值得收藏的前端技术大牛博客地址
web前端/移动端H5博客专家博客大全--值得收藏的前端技术大牛博客地址 Huang Jie Blog .Com-前端开发 http://www.huangjieblog.com/?feed=rs ...
- 2019年最新 Python 模拟登录知乎 支持验证码
知乎的登录页面已经改版多次,加强了身份验证,网络上大部分模拟登录均已失效,所以我重写了一份完整的,并实现了提交验证码 (包括中文验证码),本文我对分析过程和代码进行步骤分解,完整的代码请见末尾 Git ...
- JS实践与写博客-序
大二的时候,就开始接触JavaScript了. 当时学了1年多,主要是认真看了一本JavaScript的入门书籍,了解了JavaScript大致怎么回事.在独自做Web项目的时候,用的都是JavaSc ...
随机推荐
- HDU 2819 隐式二分图匹配
http://acm.hdu.edu.cn/showproblem.php?pid=2819 这道题乍一看是矩阵变换题,估计用矩阵之类的也可以做 但是分析一下就可以知道 要凑成对角线都是1,题目允许行 ...
- BZOJ 1019: [SHOI2008]汉诺塔
Description 一个汉诺塔,给出了移动的优先顺序,问从A移到按照规则移到另一个柱子上的最少步数. 规则:小的在大的上面,每次不能移动上一次移动的,选择可行的优先级最高的. Sol DP. 倒着 ...
- 前端之css、JavaScript和DOM
css position 一般组合 relative+absolute,以relative为父元素,absolute依照relative进行定位. opcity: 0.5 透明度 z-index: 层 ...
- Eclipse中项目红叉但找不到错误解决方法
首先windows-show view-problems 根据地址查找错误 若提示: Description Resource Path Location TypeJava c ...
- ffmpeg解码音频流
//初始化.注册编解码器 avcodec_init(); av_register_all(); avformat_network_init(); //选取测试文件 char* FileName=&qu ...
- nginx配置多域名映射方法(本地hosts)
本地测试网站的时候如果不想用localhost/xxxx的形式访问,可能就需要修改hosts文件来映射了,但是一个网站还好,假如有多个网站的话就不行了. 这时就需要配置多域名映射 比如hosts中配置 ...
- js控制精度的加减乘除:js浮点数计算问题
//加法函数 function accAdd(arg1, arg2) { var r1, r2, m; try { r1 = arg1.toString().split(".")[ ...
- centos 7 python2.7.5升级到3.5.2
centos 7 python2.7.5升级到3.5.2 下载python3.5.2 wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2 ...
- ios8 新增的 showViewController 和 showDetailViewController
1.showViewController 先看看说明: You use this method to decouple the need to display a view controller fr ...
- response content-type json
2015年11月3日 15:47:43 百度知道:ajax开发中在请求服务器端的响应时, 对于每一种返回类型 规范的做法是要在服务端指定response的contentType 常遇到下面的几种情况: ...