很多疑惑一扫而空。。。。

http://www.zhihu.com/question/35905242?sort=created

JS的单线程,浏览器的多进程,与CPU,OS的对位。

互联网移动的起起落落。。。

爽!!!

作者:igetit
链接: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解答的更多相关文章

  1. js标签放在html的什么位置比较好

    推荐的是js的script标签放在body的末尾,</body>标签之前,包含在body内! <body> <!--其它Html标签--> <script&g ...

  2. 关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用

    关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用   工作环境:window下 在一切的最开始,安装node.js (中文站,更新比较慢http://nodejs.cn/) ...

  3. 深入js隐式类型转换

    前言 相信刚开始了解js的时候,都会遇到 2 =='2',但是 1+'2' == '1'+'2'为false的情况,这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这 ...

  4. 你可能忽略的js类型转换

    前言 相信刚开始了解js的时候,都会遇到 2 == '2',但 1+2 == 1+'2'为false的情况.这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这么猝不及 ...

  5. 【本周面试题】第2周 - js单线程和异步相关问题

    硬性知识点考察: 为什么js是单线程的? 因为js设计最初是为了操作dom而生,如果是多线程的,当多个线程同时修改一个dom时就会产生冲突,所以设计成单线程,一次只能做一件事. 既然是单线程为什么要有 ...

  6. js的prototype(2)

    1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展.我们称B的原型为A. 2 javasc ...

  7. web前端/移动端H5博客专家博客大全--值得收藏的前端技术大牛博客地址

    web前端/移动端H5博客专家博客大全--值得收藏的前端技术大牛博客地址   Huang Jie Blog .Com-前端开发 http://www.huangjieblog.com/?feed=rs ...

  8. 2019年最新 Python 模拟登录知乎 支持验证码

    知乎的登录页面已经改版多次,加强了身份验证,网络上大部分模拟登录均已失效,所以我重写了一份完整的,并实现了提交验证码 (包括中文验证码),本文我对分析过程和代码进行步骤分解,完整的代码请见末尾 Git ...

  9. JS实践与写博客-序

    大二的时候,就开始接触JavaScript了. 当时学了1年多,主要是认真看了一本JavaScript的入门书籍,了解了JavaScript大致怎么回事.在独自做Web项目的时候,用的都是JavaSc ...

随机推荐

  1. Github GUI 托管代码教程

    附录:克隆仓库到本地:git clone https://github.com/chzeze/WeiboHomeCrawl.git

  2. 解决html5 video不能播放 能播放声音不能播放视频

    <video id="playVideo" style="width:90%; height:auto;" controls poster=". ...

  3. 术&道

    技术分为术和道两种. 具体做事的方法为术:做事的原理和原则是道. 追求术的人一辈子工作很辛苦,只有掌握了道的本质和精髓才能永远游刃有余. 在纷繁的选择面前, 不知到哪些是对的没关系, 知道哪些是不好的 ...

  4. Jenkins 报错:(pending—Waiting for next available executor)

    系统管理-管理节点,刷新状态

  5. C#之使用NotifyIcon实现任务栏托盘菜单,图标闪烁效果及气泡提示

    很多程序是只需要后台运行的,甚至不需要自己的应用界面.NotifyIcon提供了程序在任务栏的显示功能 程序下载链接如下: http://download.csdn.net/detail/u01031 ...

  6. Java多线程Socket在控制台输出的多人聊天室编程

    服务器端代码 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java ...

  7. iOS gcd dispatch使用注意,dispatch_syn可能产生的死锁

      我们在使用dispatch_sync 时可能会出现死锁,看下面的例子: import UIKit class ViewController: UIViewController { var seri ...

  8. 关于Intent ,Task, Activity的理解

    看到一篇好文章,待加工 http://hi.baidu.com/jieme1989/item/6e5f41d3f65be848ddf9beb9 第三篇 http://blog.csdn.net/luo ...

  9. C字符串和指针问题汇总

    空指针和传参问题 1) 段错误.形参改为二级指针即可 void GetMemory( char *p ){ p = ( ); } void Test( void ){ char *str = NULL ...

  10. nyoj_148_fibonacci数列(二)_矩阵快速幂

    fibonacci数列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 In the Fibonacci integer sequence, F0 = 0, F ...