前端-JS

JS

闭包

  • 闭包的应用:

    • 实现数据的私有
  • 内存泄漏

    • 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在
  • 闭包=内层函数+引用的外层函数变量

    const outer=()=>{
         const a = 1
         const f=()=>{
            console.log(a)
         }
         f()
    }
    outer()
    通常会再使用一个函数包裹住闭包结构,以起到对变量保护作用
    
  • 外部如果想要使用闭包的变量,则需要return

    
    function count(){
        let i = 0
        function fn(){
            i++
            console.log(`'函数被调用了${i}次'`)
        }
        return fn
    }
    const fun = count()
    fun()
    i=100 //从外部修改i无法修改,因为i是函数私有的
    
  • 内存泄漏

    以下代码谁存在内存泄漏?count变量

    • result是一个全局变量,代码执行完毕不会立即销毁
    • result使用fn函数
    • fn用到fun函数
    • fun函数里面用到count
    • count被引用就不会被回收,所以一直存在

    此时,闭包引起内存泄漏

    function fn(){
        let count = 0
        function fun(){
            count++
            console.log(`'函数被调用了${count}次'`)
        }
        return fun
    }
    const result = fn()
    result()
    result()
    result()
    

JavaScript 实现冒泡排序

//升序
function sort(items){
    for (var i = 0; i < items.length; i++) {
        for (var j = 0; j < items[i].length-i; j++) {
             if (items[j]>items[j]+1) {
                var c=items[i]
                items[j+1] = items[j]
                items[j+1] = c
            }
        }
    }
    return items.toString()
}

JS 里垃圾回收机制

  • JS 的垃圾回收机制是为了以防内存泄漏
  • JS 中最常见的垃圾回收方式是标记清除

js 如何处理防抖和节流

  • 函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时,如下,持续触发 scroll 事件时,并不执行handle函数,当1000毫秒内没有触发scroll事件时,才会延时触发scroll事件
function debounce(fn, wait) {
    var timeout = null;
    return function () {
        if (timeout !== null) clearTimeout(timeout);
        timeout = setTimeout(fn, wait);
    }
} // 处理函数 
function handle() {
console.log(Math.random()); 
}
window.addEventListener('scroll', debounce(handle, 1000));
//主要用于表单输入input
  • 函数节流(throttle):当持续触发事件时,保证一定时间段内只调用一次事件处理函数 节流通俗解释就比如我们水龙头放水,阀门一打开,水哗哗的往下流,秉着勤俭节约的优 良传统美德,我们要把水龙头关小点,最好是如我们心意按照一定规律在某个时间间隔内 一滴一滴的往下滴 如下,持续触发 scroll 事件时,并不立即执行 handle 函数,每隔 1000 毫秒才会执行一次 handle 函数

    var throttle = function (func, delay) {
        var prev = Date.now();
        return function () {
            var context = this;
            var args = arguments;
            var now = Date.now();
            if (now - prev >= delay) {
                func.apply(context, args);
                prev = Date.now();
            }
        }
    }
    function handle() { console.log(Math.random()); }
    window.addEventListener('scroll', throttle(handle, 1000))
    //主要用于表单提交
    
  • 函数防抖:将几次操作合并为一此操作进行。原理是维护一个计时器,规定在 delay 时间后 触发函数,但是在 delay 时间内再次触发的话,就会取消之前的计时器而重新设置。这样一 来,只有最后一次操作能被触发

  • 函数节流:使得一定时间内只触发一次函数。原理是通过判断是否到达一定时间来触发函数

posted @ 2022-10-10 11:15  凉宫春日大胜利  阅读(45)  评论(0)    收藏  举报