复杂的事情讲清楚,你才是真正明白了。
浏览器输入URL之后发生了什么
一共发生了6件事
- DNS解析
- 将域名解析为IP地址
- 首先读取浏览器缓存
- 浏览器缓存没有,会读取本地缓存
- 本地缓存没有,会读取路由缓存
- 路由缓存没有,会读取运营商缓存
- 运营商也没有的话,会递归匹配,从com依次,如果没有匹配到,返回报错
- tcp握手
- 三次握手
- 第一次是浏览器发送请求,通知服务器,让服务器做好准备接收
- 第二次是服务器发送,通知浏览器已经做好准备,浏览器可以发送
- 第三次是浏览器再次发送,确保正确连接
- 发送请求
请求报文 协议,请求头,请求体等 - 接收响应
响应报文 - 渲染页面
浏览器调用各种解析器 解析返回的页面
html 解析为dom树
css解析为 cssom
合并生成渲染树
计算布局 生成页面
这个步骤会执行多次 - 断开连接 tcp四次挥手
- 浏览器发起,发送给服务器,告诉服务器请求发送完毕,可以关闭
- 服务器发起,告诉浏览器,请求接收完毕,可以关闭
- 服务器发起,告诉浏览器,响应发送完毕,可以关闭
- 浏览器发起,告诉服务器,响应接收完毕,可以关闭
闭包
闭包可以理解为一个对象保存着以键值对存在的值
形成条件:
- 函数嵌套
- 内部函数可以访问外部函数的局部变量
优点:
延长外部函数局部变量的生命周期
缺点:
内存泄露,所以在闭包使用完毕之后应该及时清除
例子:
/**
* 按照形成条件可以很简单的写出一个闭包函数
*/
function fn() {
var count = 1;
return function() {
count++;
console.log(count);
}
}
var fn2 = fn();
fn2(); // 输出2;
fn2(); // 输出3
从输出可以看出闭包延长了外部函数fn
中的局部变量count
的生命周期