6.理解堆栈溢出和内存泄漏的原理,如何防止

内存泄漏

申请的内存执行完之后没有及时的清理和销毁,占用空闲内存,既不能使用也不能回收。 几种会导致内存泄露的情况:

  • 意外的全局变量
  • 被以往的计时器或回调函数
  • 脱离DOM的引用(分离的DOM节点)

解决办法

<div id="root">
    <div class="child">我是子元素</div>
    <button>移除</button>
</div>
<script>
    let btn = document.querySelector('button')
    let child = document.querySelector('.child')
    let root = document.querySelector('#root')
    
    btn.addEventListener('click', function() {
        root.removeChild(child)//虽然该.child节点确实从dom中被移除了,但全局变量child仍然对该节点有引用,导致该节点的内存一直无法释放
    })
</script>

 <div id="root">
        <div class="child">我是子元素</div>
        <button>移除</button>
    </div>
    <script>
        let btn = document.querySelector('button')

        btn.addEventListener('click', function () {
            let child = document.querySelector('.child')
            let root = document.querySelector('#root')
            //当移除节点并退出回调函数的执行上下文后会自动清除对该节点的引用
            root.removeChild(child)
        })
    </script>

堆栈溢出

一般出现在递归中,

解决办法: 利用闭包和tramopoline(蹦床原理)来解决 使用计时器或者闭包解决

蹦床函数是不断调用函数的返回值,直到它不再是一个函数

在 JavaScript 中使用递归是不安全的,

function isEven(n) {
  function isEvenInner(n) {
    if (n === 0) return true
    if (n === 1) return false
    return isEven(Math.abs(n) - 2)
  }
  function trampoline(func,arg) {
    var value=fun(arg)
    while (typeof value==='function')
    value=value() return value } return trampoline.bind(null,isEvenInner)(n) }

 

posted @ 2023-03-04 16:00  不想做混子的奋斗远  阅读(81)  评论(0)    收藏  举报