闭包
|闭包是指有权访问另一个函数作用域中的变量的函数–《JavaScript 高级程序设计》
|嵌套函数可访问声明于它们外部作用域的变量 – MDN
闭包很有用,因为它允许将函数与其所操作的某些数据(环境)关联起来。
简言之就是高阶函数- 返回一个函数的函数,这个函数可以传入参数与内部的函数绑定在一起。
ES6 - 箭头函数、箭头函数与普通函数的区别
|||箭头函数表达式的语法比函数表达式更简洁,并且没有自己的 this,arguments,super 或 new.target。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数
||引入箭头函数有两个方面的作用:更简短的函数并且不绑定 this。
|| 箭头函数不会创建自己的 this,它只会从自己的作用域链的上一层继承 this
1 |
|
this
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/this
定义
当前执行上下文(global、function 或 eval)的一个属性,在非严格模式下,总是指向一个对象,在严格模式下可以是任意值
函数上下文中的 this,取决函数调用的方式
event loop
https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
执行代码,处理事件,执行排队的子任务
视觉表现。 堆,栈,消息队列
- 当消息来临,从取出消息,
- 把相应的监听函数,把它加入栈中执行,执行完栈中的帧(函数),
- 检查是否有消息到达。如有执行第一步
-https://juejin.cn/post/7016593221815910408#heading-49
宏任务,微任务
这里只要考察代码的执行顺序,
宏任务:运行时间相对长,setTimeout,setImmediate
微任务:Promise.then, MutationObserver
运行顺序:先微,后宏
- 执行代码,先执行同步代码,异步代码加入相应的 微宏队列中
- 执行栈空,检查微队列,有就执行微队列。
- 清空微队列,检查宏队列,把任务加入执行栈,
- 执行栈完毕之后,检查微队列,重复第 3 步
1 |
|
new 运算符过程
- 新建一个空对象 newInstance
- newInstance 的原型指向构造函数的原型
- 执行构造函数,绑定 newInstance 为 this
- 如果构造函数有返回对象,使用这个返回对象为 new 的结果,如果没有返回 newInstance。
节流&防抖
节流:规定时间内,事件多次触发,只会只执行的最初一次。
防抖: 规定时间内,事件多次触发,只执行最后一次事件,重新规定时间
1 |
|
要注意绑定 this
reflow & repaint
reflow:重新计算文档中各元素的位置和几何形状,重排必然重绘
引起 reflow 的操作:
- 调整浏览器窗口的大小、
- 使用涉及计算出的样式的 JavaScript 方法、在 DOM 中添加或移除元素,以及更改某个元素的类
repaint:外观改变,不影响布局
减少 reflow
- 减少不必要的 DOM 深度
- 尽可能减少 CSS 规则的数量,并移除未使用的 CSS 规则。
- 如果您想进行复杂的渲染更改(例如动画),请在流程外执行此操作。您可以使用 position-absolute 或 position-fixed 来实现此目的。
- 避免使用不必要且复杂的 CSS 选择器(尤其是后代选择器),因为此类选择器需要耗用更多的 CPU 处理能力来执行选择器匹配
repaint:当一个元素的外观发生改变,但没有改变布局,重新把元素外观绘制出来的过程,叫做重绘。表现为某些元素的外观被改变