javascript高级学习总结二

31次阅读

共计 3257 个字符,预计需要花费 9 分钟才能阅读完成。

1、原型 – jquery 使用

注释 : 实例虽然不同,但是构造函数是同一个。

jquery 源码中,原型的使用:

为什么要把原型方法放在 $.fn 上?

好处:
只有 $ 会暴露在 window 全局变量
将插件扩展统一到 $.fn.xxx 这一个接口,方便使用

2、原型 – Zepto – 1 使用


3、什么是单线程,和异步的关系:
单线程 – 只有一个线程,只做一件事
原因 – 避免 DOM 渲染的冲突
解决方案 – 异步

4、js 单线程的原因
原因 – 避免 DOM 渲染冲突
浏览器需要渲染 DOM
js 可以修改 DOM 结构
js 执行的时候,浏览器 DOM 渲染会暂停
两段 js 也不能同时执行(都修改 DOM 就冲突了)
webworker 支持多线程,但是不能访问 DOM

解决方案 – 异步
比如:

单线程 – 总结

问题解答:单线程就是同时间只能做一件事,两段 js 不能同时执行
原因就是为了避免 DOM 渲染的冲突
异步是一种“无奈”的解决方案,虽然有很多问题

解决方案 - 异步
问题 1:没按照书写顺序执行,可读性差
问题 2:callback 中不容易模块化

5、event -loop 事件轮询
什么是 event-loop:
事件轮询,js 实现异步的具体解决方案
同步代码,直接执行
异步函数先放在异步队列中
待同步函数执行完毕,轮询执行异步队列的函数

实例分析 1:

实例分析 2:

注释:javascript 引擎,轮询机制会一直监视异步队列,当异步队列中有函数时,会拿到主线程中执行,然后再回来继续监视异步队列,当异步队列有函数时,再拿到主线程中执行,然后回来继续监视异步队列 ….

6、jqueryy-deferred- 介绍



jquery 1.5 的变化:
无法改变 js 异步和单线程的本质
只能从写法上杜绝 callback 这种形式
它是一种语法糖形式,但是解耦了代码
开放封闭原则 (对扩展开放,对修改封闭) 的很好体现

7、jquery – defered – 应用 -1

改造后:

使用 dtd.promise

8、promise – 语法回顾

9、promise – 串联

10、promise-all-race

Promise.all()方法:最终 promise 的状态有 result1、result2 决定,分成两种情况:
1. 只有 result1、result2 的状态都变成 fullfilled,promise 的状态才会变成 fullfilled,此时 result1、result2 的返回值组成一个数组,传递给 promise 的回调函数
2. 只要 result1、result2 之中有一个被 rejected,promise 的状态就会变成 rejected,此时第一个被 reject 的实例的返回值,会传递给 promise 的回调函数

Promise.race()方法:
只要 result1、result2 中有一个实例率先改变状态,promise 的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就会传递给 promise 的回调函数。

11、async-await
then 只是将 callback 拆分了
async/await 是最直接的同步写法

Generator 函数,依次读取两个文件:

改写成 async 函数,如下

一比较就会发现,async 函数就是将 Generator 函数的星号 (*) 替换成 async,将 yield 替换成 await,仅此而已。

async 函数对 Generator 函数的改进,体现在以下四点:
1. 内置执行器。
2. 更好的语义。
3. 更广的适用性。
4. 返回值是 Promise。
进一步说,async 函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而 await 命令就是内部 then 命令的语法糖。

12、什么是 vdom
virtual dom, 虚拟 DOM
用 js 模拟 DOM 结构
DOM 变化的对比,放在 js 层来做(图灵完备语言: 能实现高复杂逻辑的语言),提高效率
提高重绘性能


用 js 来模拟 dom

vdom – 总结
DOM 操作是“昂贵”的,js 运行效率高
尽量减少 DOM 操作,而不是“推倒重来”
项目越复杂,影响就越严重
vdom 即可解决这个问题

13、使用 vdom-snabbdom-1

介绍 snabbdom:

介绍 snabbdom – h 函数:

介绍 snabbdom – patch 函数

14、使用 vdom -snabbdom 示例

15、使用 vdom – 总结

16、Diff 算法 – vdom 为何要使用 Diff
DOM 操作是“昂贵”的,因此尽量减少 DOM
找出本次 DOM 必须跟新的节点来更新,其他的不更新
这个“找出”的过程,就需要 diff 算法

17、Diff 算法 – 实现 -1


18、Diff 算法 – 总结
知道什么是 diff 算法,是 linux 的基础命令
vdom 中应用 diff 算法是为了找出需要更新的节点
diff 实现,patch(container,vnode) patch(vnode,newVnode)
核心逻辑,createElement 和 updateChildren

19、从 jQuery 到框架 – 总结
数据和视图的分离,解耦 (开放封闭原则:对扩展开放,对修改封闭)
以数据驱动视图,只关心数据变化,DOM 操作给封装

20、如何理解 MVVM -MVC
MVC:

21、如何理解 MVVM -MVVM
Model - 模型、数据
View – 视图、模板(视图和模板是分离的)
ViewModel – 连接 Model 和 View 的桥梁

图解:

注释:View 通过事件绑定来操作 Model,Model 通过数据绑定来操作 View

关于 ViewModel:
MVVM 不算是一种创新
但其中的 ViewModel 却是一种创新
真正结合前端场景应用的创建

22、Vue 三要素 (MVVM 框架的三大要素)
响应式:vue 如何监听到 data 的每个属性变化?
模板引擎:vue 的模板如何被解析,指令如何处理?
渲染:vue 的模板如何被渲染成 html?以及渲染过程

23、响应式 - 介绍:修改 data 属性之后,vue 立刻监听到。实现的核心函数:Object.defineProperty (vue2.0)


重写 get 和 set 函数。

响应式 – 模拟:

24、模板解析 – 模板是什么
本质:字符串
有逻辑,如 v -if,v-for 等
与 html 格式很像,但有很大区别
最终还要转换为 html 来显示

模板最终必须转换成 js 代码,因为:
模板有逻辑,必须用 js 才能实现 (图灵完备语言)
转换为 html 渲染页面,必须用 js 才能实现
因此,模板最终要转换成一个 js 函数(render 函数)

25、render 函数 – with 的用法

26、render 函数 – 讲解

render 函数:
模板中所有信息都包含在了 render 函数中
this 即 vm
price 即 this.price 即 vm.price, 即 data 中的 price
_c 即 this._c 即 vm._c

如下图:

27、如何在源码中查找生成的 render 函数:
1. 先写一个简单的 vue-demo 示例:

2. 在未压缩的源码中搜索“code.render”。

3. 打印出来。

此时,模板已经变成了 render 函数了。

render 函数和 vdom

vm._c 其实就相当于 snabbdom 中的 h 函数。
render 函数执行之后,返回的是 vnode。

渲染页面:updateComponent

updateComponent 中 实现了 vdom 的 patch
页面首次渲染执行 updateComponent
data 中每次修改属性,执行 updateComponent

28、vue 的整个实现流程:
第一步:解析模板成 render 函数
第二步:响应式开始监听
第三步:首次渲染,显示页面,且绑定依赖
第四步:data 属性变化,触发 rerender

第一步:

第二步:

第三步:

什么要监听 get,直接监听 set 不行吗:
data 中有很多属性,有些被用到,有些可能不被用到。被用到的会走到 get,不被用到的不会走到 get。未走到 get 中的属性,set 的时候我们也无需关心。避免不必要的重复渲染

第四步:

附加:
vuex 的工作原理:
其本质就是讲我们传入的 state 作为一个隐藏的 vue 组件的 data,也就是说:我们的 commit 操作,本质上其实就是修改这个组件的 data 的值。vuex 中的 store 本质就是没有 template 的隐藏的 vue 组件。

正文完
 0