持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情
题外话
因为疫情,我所在的公司也快撑不下去了,最近也在复盘,准备随时跑路。就想着把复习过的东西总结成一个文档,“留存千古”。
正文
1. bind,apply,call的区别
这道题,绝对是面试最长问的问题之一
答案:这三个参数都是可以改变this的指向。这三个方法的第一个参数都是this要绑定的对象;bind不是立即调用,而是返回一个函数,需要再次调用才能执行;apply和call可以直接调用,但是apply方法第二个参数是接收一个参数数组;call方法接收的是一个参数列表。
2.能否手撕实现一下call,apply,bind三个方法
3. this的指向
关于this的指向问题也是一个经典题目了
this的指向拒绝与于函数调用的位置,而不是声明的位置(箭头函数除外)。
this的调用方式按照优先级从高到低可以分为四种情况:
- new绑定
- 显示绑定:apply,call,bind
- 隐式绑定:foo.obj()
- 默认调用
箭头函数是根据声明的位置决定this的指向的。剪头函数没有构造函数,所以不能使用new调用;也不能使用apply、call和bind的方式改变this指向,箭头函数的this指向外层第一个普通函数的this指向。
4. 闭包
闭包也是一个老生常谈的问题了
闭包实际上就是在一个函数内部在声明一个函数,为的就是内部的函数能够访问外部函数的变量,内部的这个函数就是一个闭包。但是闭包使用不当就造成内存泄露。
5. 模块化
- 为什么要使用模块化
- 可以解决命名冲突
- 提高代码复用性
- 提高代码可维护性
- 哪些方式可以实现模块化
- Node.js提供的Common JS(module.exports、exports、require)
- ES6提供的ES Module (export、import)
- Common JS和ES Module区别
- require是动态导入,也就是运行时加载,import是静态导入,也就是编译时加载,import命令会提升到整个模块的顶部。
- require是同步导入,import是异步导入
- require是值拷贝,就算是导出的值改变了,导入的值也不会改变,如果需要获取新的值,需要重新导入。import是值引用,也就说导出导入的值用的是一个内存地址,即使导出的值改变了,导入的值会自动改变。
Event Loop事件循环
答:js在解析代码的时候将任务分为同步任务和异步任务。同步任务进入主线程按照顺序执行,异步任务进入Event Table注册函数,一旦异步任务执行有了结果,就会进入Event Queue中等待被调用。异步任务又分为宏任务和微任务,宏任务包括script、setTimeout、setInterval、I/O输入输出时间;微任务包括promise.then(),process.nextTick。当主线程同步任务执行完毕之后,就会让事件队列event queue中寻找是否有微任务需要执行,有就执行全部微任务,执行完毕或者没有微任务就开始查找event queue是否有宏任务需要执行,在执行宏任务。