闭包
- 变量作用域和变量的生命周期有关
- 作用域链:有内到外找
作用:
- 封装变量,
如计数器:
a=a*arguments[i] -> cache[args] -> 闭包保护变量污染 -> 独立出来方便复用 - 延续局部变量的寿命,缓存,如节流与防抖
- 实现命令模式,单列模式
内存泄露
手动变量设置为null,使用闭包容易形成c循环引用,如果存在一些dom节点,浏览器自身机制,会内存泄露,爷设置为null
节流与防抖
节流
节流:拖拽mousemove,window.onresize,只相应第一次触发
原理:
- 第一次,正常执行,
if(timer){return false}timer=setTimeout((()=>{}),500)// 延迟执行
防抖
只相应最后一次触发
if(timer) clearTimeout(timer)timer=setTimeout((()=>{}),500)
bug:
一直触发,无期限延长,用户体验差,要专门设置一条延迟等待的时间底线
本质
节流与防抖的实质都是以闭包的形式包裹回调函数,通过自由变量缓存计时器信息,最后setTimeout控制事件触发的频率来实现
循环和递归
- 传统3循环:
for while do-while - for in 检测对象原型和整个原型链,慢
- forEach:直观,慢
- for of 比for in和forEach快,最好的还是传统3循环
递归
缺少终止或不明确条件,会卡顿。递归,空间换时间,执行会入栈保持大量运算结果,浏览器有js调用栈的限制,超出限制会失败。
- 迭代 慢却不受浏览器有js调用栈的限制
- 利用闭包实现缓存避免重复计算