面试宝典第一期 原生js类

210 阅读5分钟

1.闭包

首先是为什么有闭包的出现

因为在咱们JavaScript语言中有两种作用域全局作用域和局部作用 域 那么这样就导致了一个问题 函数内部可以读取全局变量 但是函数外部无法读取函数内部的局部变量 因此为了解决这个问题闭包就诞生了
这个地方需要注意 函数内部的变量需要用var 声明 如果不是声明就是一个全局变量

闭包的定义

搭建一条函数外部与函数内部的桥梁 正常情况下函数外部是访问不到函数内部的作用域变量的

闭包的作用

  1. 可以读取函数内部的变量
  2. 让这个变量的值始终保存在内存中
  3. 可以隔离作用域 解决全局变量污染的问题

闭包缺点

1.由于长期驻留在内存中 就会导致内存泄漏 2.对于长期保存在内存中 内存消耗就很大 所以不能滥用闭包 否则会造成内存泄漏 解决方案 在退出这个函数之前 将不适用的局部变量全部删除

2.js中的原型链与原型

首先什么是原型

  • 因为在js中 万物皆对象 每一个对象都用自己的属性
  • 那么 怎样才能让多个对象共享一个或者多个方法呐
  • 原型的出现就是为了解决这个问题
  • 在js中每个对象都会有一个与之相关联的对象,叫做原型对象
  • 每次获取对象属性的时候都是一次查询的过程,在对象自己的属性中查找如果找不到 就会去他的原型对象上去查找

原型链又是什么

原型连成的一条链就是原型链
在js查找属性的过程中 如果自有的属性中 找不到就会去原型对象中查找 如果原型对象中还找不到 那么就去他原型对象的原型上去查找 直到查找到原型链的顶端 Object 这个查找的过程连成的一条链就是原型链

3. 说一下es6的新特性

可以从多个方面说

  • 变量上 新增了 let 和 const
  • 函数上 新增用来简化函数的箭头函数
  • 运算符上 新增了拓展运算符
  • 字符串上 新增模板字符串
  • 声明变量上 新增了解构赋值
  • 模块上 新增import导入和导出 export、export default
  • 异步请求上 新增 Promise 、async 和 await
  • 数组上 新增的方法 建议去大佬的官网上搜索
  • 字符串上 新增的方法
  • 数据结构新增 map 和 set
  • 数据类型新增 symbol

4、js的作用域和作用域链

什么是js作用域

js作用域就是js识别变量的范围 作用域链 就是js查找变量的顺序

作用域包括那些

全局作用域 局部作用域 es6的块级作用域

作用域分别的作用

  • 全局作用域 也就是定义在window下的变量范围 在任何地方都可以访问
  • 局部作用域 在函数内部定义的变量范围
  • 块级作用域 就是用let 或者 const 声明的 任意代码块中定义的变量 就是块级作用 常用的场景 for循环中 let 定义的变量 和 if语句中
  • 注意 尽量不要使用全局变量 否则会导致全局变量污染命名冲突的问题

5.输入url页面加载发生了什么

简单来说 过程是这样的

  • DNS解析
  • TCP连接
  • 发送HTTP请求
  • 服务器处理请求返回数据响应
  • 浏览器开始解析渲染页面
  • 连接结束 连贯起来就是这样子 输入一个域名,域名要通过DNS解析找到这个域名对应的服务器地址ip 通过tcp请求连接服务器 通过web服务器返回数据 浏览器再根据返回的数据构建dom树 通过css渲染引擎以及js解析引擎将页面渲染出来 关闭tcp连接

具体细节一 合成url

用户输入url 浏览器会根据用户输入的信息判断是搜索还是网址 如果是搜索的内容 就将搜索的内容+默认搜索引擎合成新的url 如果用户输入的内容符合url规则 浏览器就会根据url协议 在当前url上加入协议合成合法的url

具体细节二 DNS域名解析

1.客户端与浏览器端

  • 在客户端和浏览器端 本地DNS之间的查找方式是递归查询 递归的过程
  • 从客户端 到 浏览器缓存
  • 浏览器缓存 到 本地hosts文件
  • 本地hosts文件 到 本地DNS解析器缓存
  • 本地DNS解析器缓存 到 本地DNS服务器
  • 最后返回到 继续从客户端开始 注意 这个过程任何一步找到就结束

如果本地DNS服务器没有查询到 就会根据本地DNS服务器设置转发器进行 接下来的操作 2.本地DNS服务器与根域名以及子域名之间 迭代的过程

  • 本地DNS服务器 与 根域名服务器 之间双向
  • 本地DNS服务器 与 顶级域名服务器 之间双向
  • 本地DNS服务器 与 权威域名服务器 之间双向 这个查找过程 有以下优点
  • DNS存在多级缓存 从离浏览器的距离排序的话 有以下
  • 浏览器缓存
  • 系统缓存
  • 路由器缓存
  • IPS服务器缓存
  • 根域名服务器缓存
  • 顶级域名服务器缓存
  • 主域名服务器缓存

具体细节三 浏览器渲染页面

分为以下几个过程 构造DOM树 样式计算 布局阶段 分层 栅格化以及显示 1.浏览器的渲染进程 将 HTML 渲染为 dom树 2.渲染引擎将css样式表解析为css规则树 3.解析js 操作dom树 和 css 规则树 合并一起生成渲染树 4.遍历渲染树 开始布局计算 每一个节点位置大小信息 5. 浏览器将所有图层数据发送给GPU 渲染线程绘制到屏幕上