JavaScript简介
JavaScript是一门用来与网页交互的语言,有三个部分组成:
- ECMAScript:由ECMA-262定义并提供核心功能;
- DOM(文档对象模型):提供与 网页内容 交互的方法和接口;
- BOM(浏览器对象模型):提供与 浏览器 交互的方法和接口。
JavaScript的历史
1995年,JavaScript问世。主要用途是替代 Perl等服务器端语言处理输入验证;
在此之前,要验证某个必填字段,或者某个输入值是否有效,需要与服务器进行一次往返通信。
从那之后,JavaScript成为所有主流浏览器的标配。
如今,JavaScript不再局限于数据验证,而是渗透到 浏览器窗口 以及 内容 的方方面面,能够实现复杂的计算与交互,包括闭包、匿名函数等。成为了一门强大的编程语言。
JavaScript的实现
ECMAScript
ECMAScript即 ECMA-262定义的语言,并不局限于web浏览器,这门语言没有输入和输出之类的方法。
这门语言定义了如下部分:
- 语法
- 类型
- 语句
- 关键字
- 保留字
- 操作符
- 全局对象
ECMAScript只是对实现这个规范描述的所有方面的一门语言的称呼。
DOM
DOM将整个页面抽象为一组分层的节点,HTML或者 XML页面的每个组成部分都是一种节点,包含不同的数据。
DOM 通过创建表示文档的树,让开发者可以随意控制网页的结构和内容。使用 DOM API,可以轻松对节点进行 增加、删除、修改 和 替换。
BOM
使用 BOM,可以操控浏览器显示页面之外的部分,HTML5以正式规范的形式涵盖了尽可能多的BOM特性。
总体来说,BOM主要针对浏览器的窗口和子窗口。不过,通常会把特定于浏览器的扩展都归在BOM的范畴,如:
-
弹出新浏览器窗口的能力;
-
移动、缩放和关闭浏览器窗口的能力;
-
navigator对象,提供关于浏览器的详尽信息;
-
location对象,提供关于浏览器加载页面的详尽信息;
-
screen对象,提供用户屏幕分辨率的详尽信息;
-
performance对象,提供浏览器内存占用、导航行为和时间统计的详尽信息;
-
对cookie的支持;
-
其他自定义对象,如 XMLHttpRequest 和 IE的ActiveXObject
HTML中的JavaScript
将JavaScript插入到 HTML 中的主要方法是使用 <script> 标签元素,此元素有 8 个属性:
async属性
立即异步加载脚本,不阻止其他页面动作,如不阻塞主线程解析HTML结构。
脚本加载完就执行。
defer属性
脚本会立即下载,脚本被延迟到 HTML文档完全解析和显示后再执行
src属性
外部文件、加载资源的路径
-
crossorigin属性 -
integrity属性 -
charset属性 -
language属性 (已废弃) -
type属性
代替 language 属性,表示代码块中脚本语言的内容类型(也称 MIME类型)。
如果 type 值是 module,则代码会被当成 es6模块,只有这时代码中才能使用 import 和 export 关键字
在HTML中有两种方式使用 script 元素:
- 直接嵌入
<script>
function sayHi() {
console.log("hello javascript!");
}
</script>
默认情况下,script元素会阻塞页面的解析和渲染。在script元素中的代码被计算完成之前,页面的其余内容不会被加载和显示。
src属性引入外部文件
<script src="example.js"></script>
扩展名.js不是必须的,但是服务器根据文件扩展名,来确定响应的正确MIME类型,如果不打算使用.js扩展名,一定要确保服务器能返回正确的MIME类型;
使用 src 属性的script元素不应该再在标签内包含其他javascript代码,浏览器只会下载和执行外部脚本文件,忽略行内代码。
script 元素可以来自外部域 的javascript 文件,可以进行jsonp跨域处理:
<script src="http://www.somewhere.com/afile.js"></script>
浏览器在解析这个资源时,会向src指定的路径发起 GET请求,以获取相应资源,这个初始请求不受浏览器同源策略的限制,但返回并执行的JavaScript受限制。
需要注意的是,这个外部资源可能会被恶意替换或者注入恶意代码,所以在包含外部域的javascrip文件时,要确保该域是自己所有的或值得信赖的,integrity 属性就是防范这种问题的武器,但这个属性不是所有浏览器都支持。