知乎大牛的关于JS解答

时间:2023-03-08 21:42:58

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

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 好吧!