重拾JavaScript

重拾JavaScript

1. JavaScript的发展历史

1995年5月,Brendan Eich只用了10天,就设计完成了这种语言的第一版。

1996年8月,微软模仿JavaScript开发了一种相近的语言,取名为JScript(JavaScript是Netscape的注册商标,微软不能用),首先内置于IE 3.0。

1996年11月,Netscape公司决定将JavaScript提交给国际标准化组织ECMA(European Computer Manufacturers Association),希望JavaScript能够成为国际标准,以此抵抗微软。

1997年7月,ECMA组织发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript。这个版本就是ECMAScript 1.0版。

基本上,JavaScript这个名字的原意是“很像Java的脚本语言”。在JavaScript语言中,函数是一种独立的数据类型,以及采用基于原型对象(prototype)的继承链。这是它与Java语法最大的两点区别。JavaScript语法要比Java自由得多。

1999年12月,ECMAScript 3.0版发布,成为JavaScript的通行标准,得到了广泛支持。

2008年7月,由于对于下一个版本应该包括哪些功能,各方分歧太大,争论过于激进,ECMA开会决定,中止ECMAScript 4.0的开发(即废除了这个版本),将其中涉及现有功能改善的一小部分,发布为ECMAScript 3.1,会后不久,ECMAScript 3.1就改名为ECMAScript 5。

2009年12月,ECMAScript 5.0版正式发布。

2015年6月,ECMAScript 6正式发布,并且更名为“ECMAScript 2015”。这是因为TC39委员会计划,以后每年发布一个ECMAScirpt的版本,下一个版本在2016年发布,称为“ECMAScript 2016”。

2016年6月: ECMAScript第七个版本。(ES7)

2017年6月: ECMAScript第八个版本。(ES8)


2. 浏览器加载网站的过程

1.首先浏览器从服务器接收到html代码,然后开始解析html

2.构建DOM树(根据html代码自顶向下进行构建),并且在同时构建渲染树

3.遇到js文件加载执行,将阻塞DOM树的构建;遇到css文件,将阻塞渲染树的构建

(script标签中的defer属性:构建DOM树的过程和js文件的加载异步(并行)进行,但是js文件执行需要在DOM树构建完成之后;

script标签中的async属性:构建DOM树、渲染树的过程和js文件的加载和执行异步(并行)进行)


3. CSS、JS的放置顺序

根据浏览器加载网站的过程,

  • <script>标签最好放在</body>标签的前面,因为放在所有body中的标签后面就不会出现网页加载时出现空白的情况,可以持续的给用户提供视觉反馈,同时在有些情况下,会降低错误的发生。
  • 而CSS标签应该放在<head> </head>标签之间,因为如果放在</body>标签的前面,那么当DOM树构建完成了,渲染树才构建,那么当渲染树构建完成,浏览器不得不再重新渲染整个页面,这样造成了资源的浪费。效率也不高。如果放在<head> </head>之间,浏览器边构建边渲染,效率要高的多。

4. 异步加载脚本

  • script标签的async=”async”属性

<script type="text/javascript" src="xxx.js" async="async"></script>

async属性是HTML5新增属性,需要Chrome、Firefox、IE9+浏览器支持;

规定一旦脚本可用,则会异步执行;
仅适用于外部脚本;
此方法不能保证脚本按顺序执行。

  • script标签的defer=”defer”属性

<script type="text/javascript" src="xxx.js" defer="defer"></script>
defer属性规定是否对脚本执行进行延迟,直到页面加载为止;
如果脚本不会改变文档的内容,可将defer属性加入到script标签中,以便加快处理文档的速度;
兼容所有浏览器;
此方法可以确保所有设置了defer属性的脚本按顺序执行。


没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。也就是说,使用了defer 或 async之后能够改变这种加载、执行的时机。

常应用在引用了广告和统计的页面中,不会影响、堵塞,更不会影响到到页面其他元素


5. repaint 和 reflow 分别指什么

浏览器渲染机制:

  • 解析 HTML 标签, 构建 DOM 树
  • 解析 CSS 标签, 构建 CSSOM 树
  • 把 DOM 和 CSSOM 组合成 渲染树 (render tree)
  • 在渲染树的基础上进行布局, 计算每个节点的几何结构
  • 把每个节点绘制到屏幕上 (painting)

repaint: 重新绘制。当各种盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定下来后,浏览器于是便把这些元素都按照各自的特性绘制了一遍,于是页面的内容出现了,这个过程称之为repaint。

reflow: 重新回流。对于DOM结构中的各个元素都有自己的盒子(模型),这些都需要浏览器根据各种样式(浏览器的、开发人员定义的等)来计算并根据计算结果将元素放到它该出现的位置,这个过程称之为reflow。

参考链接:Repaint 、Reflow 的基本认识和优化