JS基础
1. var
和let/const
的区别
var
声明的变量会挂到window上,而let
和const
不会- 同一作用域下
var
可以重复声明同名变量,而let
和const
不能 let
和const
声明形成块作用域,不能跨块访问,也不能跨函数访问- JS 变量存在「创建create、初始化initialize 和赋值assign」,var 的「创建」和「初始化」都被提升,let 的「创建」过程被提升了,但是初始化没有提升;const 只有「创建」和「初始化」,没有「赋值」过程;function 的「创建」「初始化」和「赋值」都被提升(点击查看)
let
或const
声明的变量拥有暂时性死区(TDZ):范围为从进入它的作用域,这时它不能被访问(获取或设置),直到到达声明语句。死区(dead zone)是真正短暂的(基于时间)和不受空间条件限制(基于位置)
2. 说说JS的作用域和作用域链
作用域指的是变量的可访问性和可见性。有两种作用域:全局作用域和局部作用域;局部作用域只有在固定的代码片段内可访问到。
说到作用域链,首先要先说说执行上下文,当 JavaScript 执行一段可执行代码(executable code)时,会创建对应的执行上下文(execution context)。每个执行上下文,有三个重要属性:
- 变量对象(Variable object,VO)
- 作用域链(Scope chain)
- this
当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。
3. 闭包是什么,以及使用闭包有什么问题,怎么排查
能够访问其他函数内部变量的函数,被称为 闭包。使用闭包,可能导致内存泄露(可以就垃圾回收机制也展开讲讲)。排查手段:借助谷歌的开发者工具,打开Performance面板,点击录制,然后查看JS堆内存信息的变化情况。如果呈上升状态,即有可能是内存泄露。
- 讲讲原型和原型链
- 如何用prototype实现继承
- es6的语法用过哪些
- typescript 的 type和interface区别
手写
- call,apply,bind
- 防抖和节流
- promise(讲流程)
- 实现深拷贝
- new关键字(讲流程)
- EventEmitter 发布订阅
- promise实现串行请求
- promise实现并行请求,并可以处理每一个请求的异常(请求异常不影响其他并行的请求)
- 数组去重
- 获取JS通用类型
网络
- 常见http状态码,并说出他们的含义
- get和post区别
- 三次握手和四次挥手过程
- 为什么建立连接是三次握手,关闭连接是四次挥手呢?
- HTTP和HTTPS有何区别
- HTTPS加密过程
浏览器
- 从输入URL到看到页面发生了什么
- 浏览器渲染过程
- 什么是回流,什么情况下会触发回流,如何减少回流
webpack
- 讲讲打包的流程
- webpack优化做过什么