script放到head中会怎么样?
script标签可以放到head标签里面,也可以放到body标签里面,但是由于浏览器解析HTML文件会从上到下,所以为了防止阻塞页面渲染,我们一般放到body标签的最下面。
- 阻塞页面渲染。因为浏览器解析HTML,遇到script标签会停止解析HTML,先下载执行脚本。如果脚本过大,就会导致页面渲染阻塞。
- 依赖问题。如果脚本依赖于页面中的元素,但是页面中元素未加载,那么脚本可能因为找不到元素而出错。
- 如何解决不让script标签阻塞页面渲染?
- script脚本放到body标签结尾。脚本会在页面解析完成之后执行,不会阻塞页面渲染。
async
的defer
/async
属性。异步加载脚本,等待页面解析完之后执行。
script标签的属性
src
指定外部脚本文件的URL
type
指定脚本的MIME
类型。它通常是text/javascript
表示将内容作为JavaScript代码执行。 在HTML5中可以省略。application/json
用于包含JSON
数据的脚本,不会作为JavaScript
代码执行。type=‘module’
按照ES6
模块规范来解析执行脚本,即可以使用import/export
async
异步加载脚本,加载完立即执行,不会等待页面解析完成。有可能在DOM
元素之前执行。- defer 异步加载脚本,等待整个页面解析完成之后才执行。
charset
指定脚本的字符编码。一般是UTF-8
很少使用
DOM
和BOM
BOM
对象即,window对象表示浏览器打开的窗口。提供了控制窗口行为和访问窗口属性的接口。- 常用属性如下
- location对象,当前URL相关信息。
- history对象,提供对浏览器会话历史的访问,允许在会话历史中导航
- navigator对象,浏览器的相关信息,如类型,版本等
- screen对象,用户屏幕信息。如分辨率等
innerHeight
/innerWidth
,浏览器窗口内部宽高scrollX
/scrollY
,文档在水平和垂直方向上的偏移量。
DOM
对象即document
对象,代表整个HTML文档,提供了访问和操作文档内容的接口。- 关联:document对象是window对象的属性。
JavaScript的执行上下文
执行上下文是JavaScript代码执行环境的抽象概念。JavaScript在运行时用来管理代码执行的机制。
包含:
- 变量对象(函数参数,内部变量,函数声明)
- 作用域链(当前执行上下文的父级对象的执行上下文的变量对象集合)
- this值(当前函数的执行环境 ,在全局执行上下文中,this指向全局对象。在函数执行上下文中,this的指向取决于函数的调用方式。)
类型:
- 全局执行上下文,最基础的执行上下文。每个JavaScript只有一个全局执行上下文。
- 函数执行上下文,当函数被调用的时候,会为该函数创建一个新的执行上下文,函数执行完毕,函数上下文被销毁。
- eval执行上下文,代码在eval函数中执行,创建执行上下文。
代码执行过程:首次运行JavaScript时候,浏览器引擎会创建一个全局执行上下文,添加到执行栈中,在退出浏览器的时候从执行栈中移除全局执行上下文。JavaScript代码逐行执行,遇到函数的时候,函数执行上下文被推入执行栈顶部,全局执行上下文被挂起,开始执行函数中的代码,函数执行完,函数执行上下文被移除执行栈,全局上下文主导,继续执行。
迭代器
提供了一种统一的方式来访问集合中的元素,无需了解集合内部结构。
原理:本身是一个对象,提供了一个next方法,可以返回结果对象,结果对象包含value(当前 遍历元素的)和done(完成迭代true)