1. window 对象
BOM 全写 Browser Object Model ,是浏览器对象模型
- window 是浏览器内置中的 全局对象 ,之前我们所学习的所有 Web APIs 的内容都是基于 window 对象实现的;
- window 对象下包含了 navigator、location、document、history、screen 5 个属性,即所谓的 BOM (浏览器对象模型)
- document 是实现 DOM 的基础,它其实是依附于 window 的属性
- 依附于 window 对象的所有属性和方法,使用时可以省略 window
1.1 延时函数
JS 内置了一个让代码延迟执行的函数 setTimeout ,它只执行一次,所以可以理解为把一段代码延迟执行,通常省略 window
清除延时函数:
实例:5 秒之后,文字自动消失
<body>
<p>5秒之后自动消失</p>
<script>
let p = document.querySelector('p')
let timer = setTimeout(() => {
p.style.display = 'none'
}, 5000)
</script>
</body>
递归函数 就是自己调用自己,需要注意的是,递归函数容易造成死递归,要加退出条件:
<script>
let num = 0
function fun() {
num++
console.log(123)
if (num > 5) {
return
}
fun()
}
fun()
</script>
结合递归函数,可以使用延时函数 setTimeout 实现间歇函数 setInterval 一样的功能:
<script>
let p = document.querySelector('p')
let num = 6
function fun() {
num--
p.innerHTML = `${num}秒之后自动消失`
if (num < 0) {
p.style.display = 'none'
return
}
setTimeout(fun,1000)
}
fun()
</script>
<script>
let p = document.querySelector('p')
function fun() {
let date = new Date()
p.innerHTML = date.toLocaleString()
setTimeout(fun, 1000)
}
fun()
</script>
两种定时器比较:
- setInterval 的特征是 重复 执行,首次执行会延时;
- setTimeout 的特征是延时执行,只执行 一次 ;
- clearTimeout 清除由 setTimeout 创建的定时任务
1.2 JS 执行机制
JS 语言的一大特点就是 单线程 ,也就是说,同一时间只能做一件事。
因为 JS 是为处理页面中用户的交互以及操作 DOM 而诞生的,比如我们对某个 DOM 元素进行添加和删除操作时,不能同时进行,应该先添加,之后再删除。
单线程就意味着所有的任务都需要 排队 ,等前一个任务结束,才会去执行后一个任务,这样所导致的问题就是:如果 JS 执行的时间过长,就会造成页面的渲染不连贯,给人一种页面渲染加载阻塞的感觉。
为了解决上述问题,利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JS 脚本创建多个线程,所以 JS 中出现了 同步 和 异步
1.3 同步和异步
同步 :前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。比如做饭的同步做法:我们要烧水煮饭,等 10 分钟水开了之后,再去切菜、炒菜。
异步 :假设你在做一件耗时很长的事情,在做这件事情的同时,你还可以去处理其他事情。比如做饭的异步做法:我们可以在烧水的同时,利用这 10 分钟的时间去切菜、炒菜。
同步和异步的 本质区别 是,在这条流水线上各个流程的执行顺序不同。
同步任务 都在 主线程 上执行,形成一个 执行栈
JS 的异步是通过 回调函数 实现的,一般而言,异步任务 有以下三种类型:
- (1)普通事件,如 click、resize 等;
- (2)资源加载,如 load、error 等;
- (3)定时器,包括 setInterval、setTimeout 等
异步任务相关添加到 任务队列 中,任务队列也称为 消息队列
JS 执行机制 :
- (1)先执行 执行栈 中的同步任务;
- (2)异步任务放入 任务队列 中;
- (3)一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入到执行栈,开始执行
由于主线程不断的重复获得任务 -》 执行任务 -》 再获取任务 -》 再执行,所以这种机制被称为 事件循环(event loop)
1.4 location 对象
location 的数据类型是 对象 ,它拆分并保存了 URL 地址 的各个组成部分
属性和方法:
href 属性示例:
<body>
<button>按钮</button>
<script>
let btn = document.querySelector('button')
console.log(location.href) // 获取当前地址
btn.addEventListener('click', () => {
location.href = 'https://www.baidu.com' // 地址跳转
})
</script>
</body>
search 属性示例:
准备一个提交数据的页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<form action="index.html">
<input type="text" name="username">
<button>提交</button>
</form>
</body>
</html>
在跳转的页面 index.html 打印数据:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<script>
console.log(location.search)
</script>
</body>
</html>
hash 属性示例:
<body>
<a href="#one">模拟页面1</a>
<a href="#two">模拟页面2</a>
<script>
console.log(location.hash)
</script>
</body>
后期 vue 路由的铺垫,经常用于不刷新页面,显示不同页面
reload 方法:
强制刷新,类似于 Ctrl +F5
<body>
<button>刷新</button>
<script>
let btn = document.querySelector('button')
btn.addEventListener('click', () => {
location.reload(true)
})
</script>
</body>
1.5 navigator 对象
navigator 的数据类型是 对象 ,该对象下记录了浏览器自身的相关信息,这对于网页开发者来说比较有用,它可以帮助开发者检测用户的浏览器环境,从而实现浏览器兼容性处理或者功能检测。
属性对象:
通过 userAgent 检测浏览器的版本及平台:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
function getExplorerInfo() {
var explorer = window.navigator.userAgent.toLowerCase()
if (explorer.indexOf('chrome') >= 0) {
var ver = explorer.match(/chrome\/([\d.]+)/)[1]
return { type: 'Chrome', version: ver }
}
}
alert('type:' + getExplorerInfo().type + '\nversion:' + getExplorerInfo().version)
</script>
</body>
</html>
1.6 history 对象
history 的数据类型是对象,该对象与浏览器地址栏的操作相对应,如前进、后退、历史记录等,一般在开发中用的比较少,在 OA 等办公系统中常用