美文网首页
Day39/100 (大厂面试)前端基础知识(四)

Day39/100 (大厂面试)前端基础知识(四)

作者: 赵国星 | 来源:发表于2020-09-08 23:17 被阅读0次

写在前面的话

复习好基础先~

(一)基础

1、原型和原型链

1)设计思想:

从设计之初,是为了简化类和对象的概念,以及实现类继承;

参考链接:http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html

2)prototype和__proto__区别

var a = {};

console.log(a.prototype);  //undefined

console.log(a.__proto__);  //Object {}

var b = function(){}

console.log(b.prototype);  //b {}

console.log(b.__proto__);  //function() {}

3)原型链

原型链 原型和原型链图

2、webpack打包原理

webpack是一个打包模块化 JavaScript 的工具,在 webpack里一切文件皆模块,通过 Loader 转换文件,通过 Plugin 注入钩子,最后输出由多个模块组合成的文件。 webpack专注于构建模块化项目。

遵循CommonJS规范

打包模型:

利用babel完成代码转换及解析,并生成单个文件的依赖模块Map

从入口开始递归分析,并生成整个项目的依赖图谱

将各个引用模块打包为一个立即执行函数

将最终的bundle文件写入bundle.js中

流程如下:

初始化参

开始编译 用上一步得到的参数初始Compiler对象,加载所有配置的插件,通

过执行对象的run方法开始执行编译

确定入口 根据配置中的 Entry 找出所有入口文件

编译模块 从入口文件出发,调用所有配置的 Loader 对模块进行编译,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理

完成模块编译 在经过第4步使用 Loader 翻译完所有模块后, 得到了每个模块被编译后的最终内容及它们之间的依赖关系

输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的 Chunk,再将每个 Chunk 转换成一个单独的文件加入输出列表中,这是可以修改输出内容的最后机会

输出完成:在确定好输出内容后,根据配置确定输出的路径和文件名,将文件的内容写入文件系统中。

3、浏览器事件循环机制(EvenLoop)

JS的本质是单线:

1. 一般来说,非阻塞性的任务采取同步的方式,直接在主线程的执行栈完成。

2. 一般来说,阻塞性的任务都会采用异步来执行,异步的工作一般会交给其他线程完成,然后回调函数会放到事件队列中。

当主线程的任务执行完了(执行栈空了),JS会去询问事件队列

执行一个宏任务(先执行同步代码)-->执行所有微任务-->UI render-->执行下一个宏任务-->执行所有微任务-->UI render-->......

根据HTML Standard,一轮事件循环执行结束之后,下轮事件循环执行之前开始进行UI render。即:macro-task任务执行完毕,接着执行完所有的micro-task任务后,此时本轮循环结束,开始执行UI render。UI render完毕之后接着下一轮循环。但是UI render不一定会执行,因为需要考虑ui渲染消耗的性能已经有没有ui变动

浏览器环境下的 异步任务 分为 宏任务(macroTask) 和 微任务(microTask):

宏任务(macroTask):script中代码、setTimeout、setInterval、I/O、UI render;

微任务(microTask):Promise、Object.observe、MutationObserver。

当满足执行条件时,宏任务(macroTask) 和微任务(microTask) 会各自被放入对应的队列:宏队列(Macrotask Queue) 和微队列(Microtask Queue) 中等待执行。

关于async/await、promise和setTimeout执行顺序

首先,new Promise是同步的任务,会被放到主进程中去立即执行。而.then()函数是异步任务会放到异步队列中去,那什么时候放到异步队列中去呢?当你的promise状态结束的时候,就会立即放进异步队列中去了。

带async关键字的函数会返回一个promise对象,如果里面没有await,执行起来等同于普通函数;如果没有await,async函数并没有很厉害是不是

await 关键字要在 async 关键字函数的内部,await 写在外面会报错;await如同他的语意,就是在等待,等待右侧的表达式完成。此时的await会让出线程,阻塞async内后续的代码,先去执行async外的代码。等外面的同步代码执行完毕,才会执行里面的后续代码。就算await的不是promise对象,是一个同步函数,也会等这样操作

(二)算法

递归实现N的阶乘

let i=1;

const f=function(n){

    if(n<=1) return 1;

    return n*f(n-1);

}

(三)软件及工具

1、用Vscode

2、技术栈用Vue

参考链接:

https://www.cnblogs.com/shuiyi/p/5305435.html

https://www.jianshu.com/p/06d55a1debd5

https://juejin.im/post/6844904007463337997

https://www.jianshu.com/p/75107522813f

https://blog.csdn.net/yun_hou/article/details/88697954

以上

有前端问题/学习疑惑,可以私信我一起讨论~

相关文章

网友评论

      本文标题:Day39/100 (大厂面试)前端基础知识(四)

      本文链接:https://www.haomeiwen.com/subject/wjadektx.html