写在前面
SAST2020前端组授课——JavaScript基础学习教程系列
语言介绍
JavaScript 官方名称是 ECMAScript
是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。
1995年2月Netscape的布兰登.艾奇
开发了针对网景公司的 Netscape Navigator
浏览器的脚本语言LiveScript。之后Netscape与Sun公司联盟后LiveScript更名为JavaScript。
早期的因特网,网速慢、网费高,诞生了在客户端完成一些基本的表单验证的需求。
后来JavaScript不仅仅只是客户端的数据验证,而是具备了浏览器窗口及其内容几乎所有方面的交互能力。
微软在javascript发布后为了抢占市场推出了JScript。为了让脚本语言规范不在混乱,根据javascript 1.1版本推出了 ECMA-262的脚本语言标准。
ECMA是欧洲计算机制造商协会由Sum、微软、NetScape公司的程序员组成。
文档中会经常使用
JS
简写来代替JavaScript
关于java和JavaScript的区别:
完全不一样!
印度和印度尼西亚的区别。
JavaScript的语言特点:
大杂烩:
C语言的基本语法,Java的内存管理,Python的动态类型,Schema的函数式(匿名函数、lambda),Self基于原型prototype的继承机制……
适用场景(JavaScript有什么用)
-
浏览器网页端开发
-
改变网页HTML元素的内容、属性(操作DOM树)
-
改变CSS的样式(改变CSSOM树)
-
处理业务逻辑、数据通信、事件监听、管理页面生命周期等
MVC:经典设计模式。
- 什么是设计模式?
设计模式是一套被反复使用的代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式是开发工程化的基石。可以理解成面对一个现实需求时候的常态解决方案框架。
-
MVC模式:
MVC:Model View Controller,即模型、试图、控制器。
Model层:模型(用于封装业务逻辑相关的数据和对数据的操控)
View层:试图(渲染图形化界面,即GUI)
Controller层:控制器(M和V直接的连接器,主要处理核心业务逻辑,数据通信、控制M和V的更新等)
-
-
做为服务器后台语言使用Node.js
-
移动端手机APP和小程序开发,如Facebook的 React Native、
uniapp
、微信小程序、支付宝小程序等 -
跨平台的桌面应用程序,如使用 electronjs(VScode)
所以JS是一专多能的语言,非常适合学习使用。
发展历史
-
1994年Netscape(网景)公司发布了
Navigator
浏览器1.0版本,市场占用率超过90% -
1995年发布了
JavaScript
语言 -
1996年 JS在
Navigator
浏览器中使用 -
1996年微软发布
JScript
在IE3.0中使用 -
1996年11月网景公司将JS提交给ECMA(国际标准化组织)成为国际标准,用于对抗微软。
由ECMA的第39号技术专家委员会(Technical Committee 39,简称TC39)负责制订ECMAScript标准,成员包括Microsoft、Mozilla、Google等大公司。
-
1997年 ECMA发布ECMA-262标准,推出浏览器标准语言
ECMAScript 1.0
ECMAScript 是标准而Javascript是实现
-
…
-
2009年ECMAScript 5.0发布
-
2011年ECMAScript5.1发布,成为ISO国际标准,从而推动所有浏览器都支持
-
…
-
2015年ECMAScript6发布,更名为ECMAScript 2015。
-
2016年ECMAScript7发布,ECMAScript2016
-
2017年ECMAScript8发布,ECMAScript2017
-
2018年ECMAScript9发布,ECMAScript2018
-
2019年ECMAScript10,ECMAScript2019
-
2020年ECMAScript11,ECMAScript2020
-
…
从2015年开始 tc39
委员会决定每年发布新的ECMAScript版本
兼容性
下面是ES6兼容性状况,你也可以在 https://caniuse.com/网站查看。
can i use网站可以查询css、js等的一些兼容性,比如不同浏览器对flex弹性布局属性的支持
### 学习准备
浏览器
chrome
或 firefox
或Edge
浏览器来进行学习。
编辑器
推荐使用 vscode
编辑器开始学习,需要安装一些插件才可以高效使用。
控制台是调试代码的好地方,打开方式如下
- Mac:
Option+Command+J
- Win/Linux:
f12
或Ctrl+Shif+I
运行流程
JavaScript的运行环境:
就像C++/C需要编译环境一样(MSVC、GCC、MingW……),JavaScript也有着自己的编译环境。
JS引擎-JS内核:负责解析和执行JS代码。
JS的引擎常内嵌在各个浏览器中,不同的浏览器有着不同的JS引擎。
浏览器 | JS引擎 |
---|---|
Chrome | V8 |
Webkit(Safari) | JavaScriptCore |
Mozilla | SpiderMonkey |
React Native(框架) | Hermes |
这些引擎在编译JS的时候大致的流程都是差不多的。
JavaScript是一个解释型语言:
JavaScript本质上是一种解释型语言,与编译型语言不同的是它需要一遍执行一边解析,而编译型语言在执行时已经完成编译,可直接执行。
前端访问流程的基本分析:
浏览器渲染网页的原理:
浏览器将域名通过网络通信从服务器拿到html文件后:
- 据html文件和css文件构建DOM树和CSSOM树。构建DOM树期间,如果遇到JS,阻塞DOM树及CSSOM树的构建,优先加载JS文件,加载完毕,再继续构建DOM树及CSSOM树。
- 建渲染树(Render Tree),渲染树由DOM树、CSSOM树合并而成。
- 页面的重绘(repaint)与重排(reflow,也有称回流)。页面渲染完成后,若JS操作了DOM节点,根据JS对DOM操作动作的大小,浏览器对页面进行重绘或是重排。
JS请求处理步骤可以简单用一下语言去描述:
用户会送服务器请求相关的html、css和js的源码,浏览器在用户端进行渲染。
浏览器同时会接受一些来自服务器的数据和资源,开辟一个空间去存。
另外,浏览器可以监听用户的事件(事件监听),比如按钮、弹窗等……可以理解成一段程序代码或者函数。
我们这里讲的主要是指的是在浏览器端,也就是用户端能够运行的一些逻辑,并非是服务器端的逻辑代码。因此我们并不需要搭建后台环境。
但如果后期需要用js写后台环境,就需要搭建后台服务器环境。
Js运行的宿主环境:浏览器、Node等
如何运行一段JavaScript代码?
在JS的运行环境中解释执行。
如:Chrome、Node(都是V8引擎)
-
Chrome(或其他浏览器):开发者工具-控制台。
-
Node:nodejs终端,在IDE中进行调试。
尝试进行
Hello World!
的输出:
1 console.log("Hello,World!")在JS中,最常见的数据输入是通过Form表单,但这里为了学习需要,“输入”我们可以用
prompt()
函数。
1 var a = prompt("Please input values:");
脚本定义
定义方式
内嵌脚本
像style标签一样,可以在html文档中使用script
标签嵌入javascript代码。
1 | <script> |
外部文件
通过设置 src
属性引入外部js文件。
1 | <script src="sast.js"> |
引入外部文件在标签体内的脚本不会执行,下面的alert弹窗不会执行。
1 | <script src="sast.js"> |
**注:**旧的 JavaScript 例子也许会使用 type 属性:<script type="text/javascript">
type 属性不是必需的。JavaScript 是 HTML 中的默认脚本语言。
在外部文件中放置脚本有如下优势:
- 分离了 HTML 和代码
- 使 HTML 和 JavaScript 更易于阅读和维护
- 已缓存的 JavaScript 文件可加速页面加载
定义位置
如果js放在 <head>
标签中要等到js加载并解析后才会显示<body>
标签中的内容。
延迟体验
下面是延迟加载的示例
1 | <head> |
sast.js
内容如下
1 | alert('Hello,SAST!'); |
h1标签会在sast.js文件加载并解析后才会显示。
推荐做法
为了解决上面的问题,可以将js放在</body>
前。
1 | <head> |
关于这个延迟加载,其实原因本质上是因为,浏览器渲染页面的时候,JS的执行和css、html的渲染是在同一个主线程执行的,所以是有着先后的顺序的。
<script>
标签中的defer = "defer"
属性也可以使得JavaScript的加载延迟到html标签之后。
<script>
标签中的async = "async"
属性可以使得JS异步加载。
可以思考一下:
为什么JS和html页面的渲染需要顺序进行,而不能同时进行,除了两者本身就是同一个线程这个客观原因?
因为浏览器渲染页面的原理中,html和css分别构建DOM树以及render树,最后共同确定了页面各个元素的布局和样式,然而js有一些操作是可以去修改这个dom树的,是可以对已经渲染好的元素进行修改,这就导致两者不能同时进行。
代码注释
和大部分语言使用的注释方式相仿,JavaScript有单行和多行注释。
单行注释
1 | <script> |
多行注释
1 | <script> |
分号结束
使用分号表示一段指令的结束,当没有输入分号时如果有换行符JS会自动添加分号,减少错误的发生。
- 但推荐每个指令都以分号结束
- 在使用构建工具时,不使用分号结束可能会造成异常
1 | let sast = true; |