zoukankan      html  css  js  c++  java
  • JavaScript Closure 的第一次使用

    今天在帮沈老司机调一个代码。

    一开始的代码是通过写一个定时器然后通过 document.getElementById('')来获取 div 的高度,然后设置了一个计时器来动态更新高度的。

    开始大概是这个样子的

    setInterval(() => {
      let x = document.getElementById("code-mirror-editor");
      // 事实证明,scrollIntoView 很难用,非常难用
      // 这里还有个 bug,就是使用鼠标和使用触摸板的行为还不一致,使用触摸板的时候不会 scroll
      document.getElementById('code-mirror-editor').scrollIntoView(false);
    }, 1000)
    

    然后想了一个写法,我们动态计算高度

    setInterval(() => {
    	let x = document.getElementById("code-mirror-editor");
      x.scrollTo(0, x.scrollHeight);
    }, 1000)
    

    ok,我们使用 scrollTo 的实现了需求。然后,众所周知,dom 的查询是非常损耗性能的,于是,闭包版本的来了。这也是我人生中第一次用闭包。哈哈哈哈哈

    let x = document.getElementById("code-mirror-editor");
    setInterval(() => {
      (function(_x) {
        _x.scrollTo(0, _x.scrollHeight);
      })(x)
    }, 1000)
    

    这里我理解的大概是这样,我们定义的 x 变量,由于在闭包环境下,不会被 js 的垃圾回收器回收,x 就一直保持了对 原来的 document.getElementById("code-mirror-editor"); 的引用,然后我们在 function 里面就能一直拿到document.getElementById("code-mirror-editor");,所以,多用了一些内存,大大减少了DOM 查询带来的开销。

  • 相关阅读:
    openwrt 更改 debug 等级(hostapd)
    openwrt 中procd
    openwrt增加串口登录需要密码
    openwrt设置语言的过程
    小程序感悟123
    如何用php实现分页效果
    如何利用h5将视频设置为背景
    关于js中定时器的返回值问题
    canvas二:绘制圆和其他曲线
    canvas一:基本认识
  • 原文地址:https://www.cnblogs.com/ssaylo/p/13274257.html
Copyright © 2011-2022 走看看