原型

异步

一、什么是单线程,和异步有什么关系

单线程:只有一个线程,同一时间只能做一件事

原因:避免DOM渲染的冲突
解决方案:异步

为什么js只有一个线程:避免DOM渲染冲突

  • 浏览器需要渲染DOM
  • JS可以修改DOM结构
  • JS执行的时候,浏览器DOM渲染会暂停
  • 两端JS也不能同时执行(都修改DOM就冲突了)
  • webworker支持多线程,但是不能访问DOM

 

解决方案存在的问题

  • 问题一:没按照书写方式执行,可读性差
  • 问题二:callback中不容易模块化

二、什么是event-loop

  • 事件轮询,JS实现异步的具体解决方案
  • 同步代码,直接执行
  • 异步函数先放在异步队列中
  • 待同步函数执行完毕,轮询执行异步队列的函数

  1. setTimeout(function(){
  2. console.log(1);
  3. },100); //100ms之后才放入异步队列中,目前异步队列是空的
  4. setTimeout(function(){
  5. console.log(2); //直接放入异步队列
  6. })
  7. console.log(3) //直接执行
  8. //执行3之后,异步队列中只有2,把2拿到主线程执行,2执行完之后,异步队列中并没有任务,所以一直轮询异步队列,直到100ms之后1放入异步队列,将1拿到主线程中执行

  1. $.ajax({
  2. url:'./data.json',
  3. success:function(){ //网络请求成功就把success放入异步队列
  4. console.log('a');
  5. }
  6. })
  7. setTimeout(function(){
  8. console.log('b')
  9. },100)
  10. setTimeout(function(){
  11. console.log('c');
  12. })
  13. console.log('d')
  14. //打印结果:
  15. //d //d
  16. //c //c
  17. //a //b
  18. //b //a
  19. //真实环境不会出现dacb

三、是否用过jQuery的Deferred

  • jQuery1.5的变化
  • 使用jQuery Deferred
  • 初步引入Promise概念

 

jQuery1.5之前


  1. var ajax = $.ajax({
  2. url:'./data.json',
  3. success:function(){
  4. console.log('success1');
  5. console.log('success2');
  6. console.log('success3');
  7. },
  8. error:function(){
  9. console.log('error');
  10. }
  11. })
  12. console.log(ajax); //返回一个XHR对象

 

jQuery1.5之后


  1. var ajax = $.ajax('./data.json');
  2. ajax.done(function(){
  3. console.log('success1')
  4. })
  5. .fai(function(){
  6. console.log('fail')
  7. })
  8. .done(function(){
  9. console.log('success2');
  10. })
  11. console.log(ajax); //deferred对象

  1. var ajax = $.ajax('./data.json');
  2. ajax.then(function(){
  3. console.log('success1')
  4. },function(){
  5. console.log('error1');
  6. })
  7. .then(function(){
  8. console.log('success2');
  9. },function(){
  10. console.log('error');
  11. })
  12. //使用
  13. var w = waithandle()
  14. w.then(function(){
  15. console.log('ok1');
  16. },function(){
  17. console.log('err2');
  18. })
  19. .then(function(){
  20. console.log('ok2');
  21. },function(){
  22. console.log('err2');
  23. })
  24. //还有w.wait w.fail
  • 无法改变JS异步和单线程的本质
  • 只能从写法上杜绝callback这种形式
  • 它是一种语法糖,但是解耦了代码
  • 很好的提现:开放封闭原则(对扩展开放对修改封闭)
使用jQuery Deferred

  1. //给出一段非常简单的代码,使用setTimeout函数
  2. var wait = function(){
  3. var task = function(){
  4. console.log('执行完成');
  5. }
  6. setTimeout(task,2000)
  7. }
  8. wait();
  9. //新增需求:要在执行完成之后进行某些特别复杂的操作,代码可能会很多,而且分好几个步骤

  1. function waitHandle(){
  2. var dtd = $.Deferred();//创建一个deferred对象
  3. var wait = function(dtd){ // 要求传入一个deferred对象
  4. var task = function(){
  5. console.log("执行完成");
  6. dtd.resolve(); //表示异步任务已完成
  7. //dtd.reject() // 表示异步任务失败或者出错
  8. };
  9. setTimeout(task,2000);
  10. return dtd;
  11. }
  12. //注意,这里已经要有返回值
  13. return wait(dtd);
  14. }
  15. /*
  16. *总结:dtd的API可分成两类,用意不同
  17. *第一类:dtd.resolve dtd.reject
  18. *第二类:dtd.then dtd.done dtd.fail
  19. *这两类应该分开,否则后果严重!
  20. *可以在上面代码中最后执行dtd.reject()试一下后果
  21. */
使用dtd.promise()

  1. function waitHandle(){
  2. var dtd = $.Deferred();
  3. var wait = function(){
  4. var task = function(){
  5. console.log('执行完成');
  6. dtd.resolve();
  7. }
  8. setTimeout(task,2000)
  9. return dtd.promise(); //注意这里返回的是promise,而不是直接返回deferred对象
  10. }
  11. return wait(dtd)
  12. }
  13. var w = waitHandle(); //promise对象
  14. $.when(w).then(function(){
  15. console.log('ok1');
  16. },function(){
  17. console.log('err1');
  18. })
  19. /*
  20. 只能被动监听,不能干预promise的成功和失败
  21. */
  • 可以jQuery1.5对ajax的改变举例
  • 说明如何简单的封装、使用deferred
  • 说明promise和Defrred的区别

要想深入了解它,就需要知道它的前世今生

四、Promise的基本使用和原理

基本语法回顾
异常捕获

//规定:then只接受一个函数,最后统一用catch捕获异常

多个串联

  1. var scr1 = 'https://www.imooc.com/static/img/index/logo_new.png';
  2. var result1 = loadImg(src1);
  3. var src2 = 'https://www.imooc.com/static/img/index/logo_new.png';
  4. var result2 = loadImg(src2);
  5. result1.then(function(img1) {
  6. console.log('第一个图片加载完成', img1.width);
  7. return result2;
  8. }).then(function(img2) {
  9. console.log('第二个图片加载完成', img2.width);
  10. }).catch(function(ex) {
  11. console.log(ex);
  12. })
Promise.all和Promise.race

  1. //Promise.all接收一个promise对象的数组
  2. //待全部完成后,统一执行success
  3. Promise.all([result1, result2]).then(datas => {
  4. //接收到的datas是一个数组,依次包含了多个promise返回的内容
  5. console.log(datas[0]);
  6. console.log(datas[1]);
  7. })
  8. //Promise.race接收一个包含多个promise对象的数组
  9. //只要有一个完成,就执行success
  10. Promise.race([result1, result2]).then(data => {
  11. //data即最先执行完成的promise的返回值
  12. console.log(data);
  13. })
Promise标准
  • 三种状态:pending,fulfilled,rejected
  • 初始状态:pending
  • pending变为fulfilled,或者pending变为rejected
  • 状态变化不可逆

promise必须实现then这个方法
then()必须接收两个函数作为标准
then

五、介绍一下async/await(和Promise的区别、联系)

六、总结一下当前JS结局异步的方案

虚拟DOM

  • vdom 是 vue 和 React 的核心,先讲哪个都绕不开它
  • vdom 比较独立,使用也比较简单
  • 如果面试问到 vue 和 React 和实现,免不了问 vdom

问题

- vdom 是什么?为何会存在 vdom?

什么是vdom

  • virtual dom,虚拟DOM
  • 用JS模拟DOM结构
  • DOM变化的对比,放在JS层来做(图灵完备语言:能实现各种逻辑的语言)
  • 提高重绘性能

DOM


  1. <ul id="list">
  2. <li class="item">Item 1</li>
  3. <li class="item">Item 2</li>
  4. </ul>

虚拟DOM:


  1. {
  2. tag: 'ul',
  3. attrs: {
  4. id: 'list'
  5. },
  6. children: [{
  7. tag: 'li',
  8. attrs: { className: 'item' },
  9. children: ['item1']
  10. },
  11. {
  12. tag: 'li',
  13. attrs: { className: 'item' },
  14. children: ['item2']
  15. }
  16. ]
  17. }
  18. //className代替class,因为class是js的保留字

浏览器最耗费性能就是DOM操作

现在浏览器执行JS性能非常低

设计一个需求场景

用jQery实现

遇到的问题

  • vdom 的如何应用,核心 API 是什么
  • 介绍一下 diff 算法
说一下使用 jquery 和使用框架的区别

jQuery 实现 todo-list

vue 实现 todo-list

jQuery 和框架的区别

  • 数据和视图的分离,解耦(开放封闭原则)
  • 以数据驱动视图,只关心数据变化,DOM 操作被封装
说一下对 MVVM 的理解
  • MVC
  • MVVM
  • 关于ViewModel

MVVM和vue

组件化和React

hybrid

未完待续,每日更新

来源:https://segmentfault.com/a/1190000017498782

Javascript高级面试的更多相关文章

  1. 面试 11-00.JavaScript高级面试

    11-00.JavaScript高级面试 #前言 一.基础知识: ES 6常用语法:class .module.Promise等 原型高级应用:结合 jQuery 和 zepto 源码 异步全面讲解: ...

  2. 前端JavaScript高级面试笔记

    一.ES6 1.模块化 ES6通过export和import实现模块化 ES6的模块化的基本规则或特点, 欢迎补充: 1:每一个模块只加载一次, 每一个JS只执行一次, 如果下次再去加载同目录下同文件 ...

  3. javascript高级编程笔记01(基本概念)

    1.在html中使用JavaScript 1.  <script> 元素 <script>定义了下列6个属性: async:可选,异步下载外部脚本文件. charset:可选, ...

  4. 《JavaScript高级程序设计》 -- 基本概念(一)

    之前看过好几遍<JavaScript高级程序设计>这一书,但是始终没有完完整整的看过一遍.从现在开始我会把它完整的啃一遍,每章节都记录笔记,自己的心得,加油! 由于前三章的内容比较简单,因 ...

  5. JavaScript高级特性-创建对象的九种方式

    1. 对象字面量 通过这种方式创建对象极为简单,将属性名用引号括起来,再将属性名和属性值之间以冒号分隔,各属性名值对之后用逗号隔开,最后一个属性不用逗号隔开,所有的属性名值对用大括号括起来,像这样: ...

  6. 《JavaScript高级程序设计(第3版)》笔记-序

    很少看书,不喜欢看书,主要是上学时总坐不住,没有多大定性,一本书可以两天看完,随便翻翻,也可以丢在角落里几个月不去动一下. 上次碰到了<JavaScript高级程序设计(第3版)>感觉真的 ...

  7. 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介

    前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...

  8. 【javascript学习——《javascript高级程序设计》笔记】DOM操作

    DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口).DOM描绘了一个层次节点树,允许开发人员添加.移除和修改. 1.节点层次 <html> <head& ...

  9. 读javascript高级程序设计00-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

随机推荐

  1. fabric报错:Fatal error: run() received nonzero return code 1 while executing!

    今天在使用fabric远程安装rpm时,一直报:Fatal error: run() received nonzero return code 1 while executing! 这看起来也是没笔病 ...

  2. sh_05_偶数求和

    sh_05_偶数求和 # 计算 0 ~ 100 之间 所有 偶数 的累计求和结果 # 开发步骤 # # 1. 编写循环 确认 要计算的数字 # 2. 添加 结果 变量,在循环内部 处理计算结果 # 1 ...

  3. mini-batch

    我们在训练神经网络模型时,最常用的就是梯度下降,梯度下降有一下几种方式: 1.Batch gradient descent(BGD批梯度下降) 遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度 ...

  4. 3D Computer Grapihcs Using OpenGL - 20 结合Buffer

    在上一节的案例中,我们使用了四个Buffer Object,立方体的VertexBuffer,立方体的索引Buffer,四面体的VertexBuffer,四面体的索引Buffer. 我们这节尝试把两个 ...

  5. 好题Islands

    Orz yjc 吊打候选队 不好的思路是枚举森林的m块,这样DP显然会涉及n当做某一维,最多只能卷积优化一下 生成函数什么的n太大不用想 考虑m,k比较小,能不能把n变成一个系数,而不是维度 所以就是 ...

  6. 大数据笔记(二十七)——Spark Core简介及安装配置

    1.Spark Core: 类似MapReduce 核心:RDD 2.Spark SQL: 类似Hive,支持SQL 3.Spark Streaming:类似Storm =============== ...

  7. spring boot中使用ehcache

    1在启动类上使用注解 @SpringBootApplication @EnableCaching public class ConfApplication { ...... } 2在resources ...

  8. linux 上使用libxls读和使用xlslib写excel的方法简介

      读取excel文件:libxls-1.4.0.zip下载地址:http://sourceforge.net/projects/libxls/安装方法: ./configure make make ...

  9. HDU6025 Coprime Sequence(gcd)

    HDU6025 Coprime Sequence 处理出数列的 \(gcd\) 前缀和后缀,删除一个数后的 \(gcd\) 为其前缀和后缀的 \(gcd\) . 遍历数列取 \(max\) 即为答案. ...

  10. ffplay播放PCM裸流

    ffplay -f s16le -ar 48000 -ac 2 d:\lei.pcm