IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> js:vue中使用封装的防抖函数,引发的闭包相关问题的思考 -> 正文阅读

[JavaScript知识库]js:vue中使用封装的防抖函数,引发的闭包相关问题的思考

防抖函数的封装请看前端面试题(js):手写防抖节流?

在一个防抖操作中,内部timer变量需要被一直保存 -> 封装防抖函数时使用闭包 -> 使用防抖函数时,用一个变量引用包含闭包的函数

1.防抖函数的核心:

声明的timer变量,且在一个防抖操作中,timer需要一直保存,不被销毁。

一般函数执行完,函数内部变量自动回收,如何做到timer不被销毁?

2.利用闭包,保存timer。

闭包的前提:函数嵌套,且内层函数对外层函数的变量有引用。

闭包的生命周期:

1.产生:内部函数定义时产生,即外部函数被调用。

2.死亡:包含闭包的函数对象成为垃圾对象。

<body>
<!--
1. 产生: 在嵌套内部函数定义执行完时就产生了(不是在调用)
2. 死亡: 在嵌套的内部函数成为垃圾对象时
-->
<script type="text/javascript">
  function fn1() {
    //此时闭包就已经产生了(函数提升, 内部函数对象已经创建了)
    var a = 2
    function fn2 () {
      a++
      console.log(a)
    }
    return fn2
  }
  var f = fn1()
  f() // 3
  f() // 4
  f = null //闭包死亡(包含闭包的函数对象成为垃圾对象)
</script>
</body>

3.在vue中,如何使用一个变量,保存对包含闭包的函数的引用?

使用场景一:直接声明变量,引用防抖函数(包含闭包的函数

使用场景二:在钩子函数中声明变量引用防抖函数(包含闭包的函数,这个目前还没搞懂。

以下代码,可以看到mounted内部又产生一个闭包,保存了refresh,refresh引用了防抖函数(包含闭包的函数)。盲猜vue实例引用了这个包含闭包(refresh)的函数对象,后续再做补充。

4.当前vue实例销毁时,清除对包含闭包的函数的引用,即清除闭包

当前vue实例销毁时,清除闭包。最初我是这样做的:

    onUnload() {    // beforeDestroyed
      this.inputDebounce = null
    },

即手动清对包含闭包的函数的引用。后来我想了下,当vue实例销毁时,当前vue实例内部的变量被销毁了吗,那我还需要手动清除吗?后续再做补充。

5.实际使用

防抖函数已在utils文件夹下封装好,于是我在uni-app项目中用了下,有两种方法:(vue同理)

法一:

<template>
  <view>
    <view class="search-box">
      <uni-search-bar @input="inputDebounce" placeholder="请输入搜索内容" radius="18" cancelButton="none" focus="always"/>
    </view>
  </view>
</template>

<script>
  import { debounce } from '@/utils'
  
  export default {
    data() {
      return {
      };
    },
    methods: {
      searchInput(e) {
        console.log(e)
      },
      inputDebounce: debounce(function(e) { //这里的inputDebounce引用了防抖函数
        this.searchInput(e)
      })
    },
    onUnload() {
      this.inputDebounce = null
      console.log(this.inputDebounce)
    },
  }
</script>

法二:

<template>
  <view>
    <view class="search-box">
      <uni-search-bar @input="inputDebounce" placeholder="请输入搜索内容" radius="18" cancelButton="none" focus="always"/>
    </view>
  </view>
</template>

<script>
  import { debounce } from '@/utils'
  
  export default {
    data() {
      return {
        inputDebounce: debounce(function(e) { //这里的inputDebounce引用了防抖函数
          this.searchInput(e)
        })
      };
    },
    methods: {
      searchInput(e) {
        console.log(e)
      },
    },
    onUnload() {
      this.inputDebounce = null
      console.log(this.inputDebounce)
    },
  }
</script>

如有错误,欢迎指正

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:34:49  更:2022-08-06 10:38:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/11 12:40:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码