javascript

112 阅读1分钟

闭包

  • 变量作用域和变量的生命周期有关
  • 作用域链:有内到外找

作用:

  • 封装变量, 如计数器: 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调用栈的限制
  • 利用闭包实现缓存避免重复计算