前端面试题-js-new关键字-this指向-js事件流-防抖节流

news2024/11/17 11:33:10

前端面试题-js-new关键字-this指向-js事件流-防抖节流

  • new 关键字都做了什么 this指向问题
  • JS事件流
  • 防抖节流函数

new 关键字都做了什么 this指向问题

1.创建一个简单的空对象
2.原型的绑定,确定对象O的原型链
3.绑定this对象为O,传入参数;执行Person构造函数,进行属性和方法的赋值操作
4.返回结果
普通函数的this指向
函数的this指向有一个基本的原则,谁调用的函数,函数的this就指向谁,否则指向全局
箭头函数的this指向
箭头函数本身没有this,箭头函数的this是定义箭头函数时父级作用域的this,也就是说使用箭头函数的时候,箭头函数内部的this,我们只需要看档箭头函数定义时,该箭头函数的父级的this即可
构造函数指向new出来的新对象

JS事件流

DOM事件流是有两种的,一种是捕获事件一种是冒泡事件
事件捕获(event capturing):由微软公司提出,事件从文档根节点(Document对象)流向目标节点,途中会经过目标节点的各个父级节点,并在这些节点上触发捕获事件,直至到达文档根节点。(下图点击的粉色方块)
在这里插入图片描述

事件冒泡(event bubbling):由网景公司提出,与捕获时间相反,世界会从目标节点流向文档的根元素节点,途中会经过目标节点的各个父级节点,并在这些节点上触发捕获事件,直至到达文档的根节点。整个过程就像水中的奇葩一样,从水底向上运动。(下图点击的浅粉色方块)
在这里插入图片描述
W3C为了统一标准,采用了折中的方式,即将事件捕获与事件冒泡合并,也就是现在的先捕获后冒泡。

怎么阻止事件冒泡
1.w3c: event.stopPropagation()
2.IE: window.event.cancelBubble = true
3.vue (扩展)事件修饰符stop

** 怎么阻止默认事件**
event.preventDefault()

什么是事件委托
使用事件冒泡原理,自己所触发的事件,让其父元素代为执行
例如:富文本解析在不改变富文本内容的情况下给图片实现点击放大预览效果 可以把事件给到解析富文本的那个盒子 然后通过event 去判断点击是不是图片 再进行下面的事件处理

防抖节流函数

函数防抖:规定涣散至少间隔多久执行(窗口大小的变化,模糊查询)
函数节流 :规定函数在某时间段内最多执行一次(典型案例就是鼠标不断点击触发,规定在n秒内多次点击只有一次生效,用户登录等场景)

函数防抖和函数节流的对比:
不管是函数节流还是函数防抖,减少都是事件处理程序的调用频率,而不是时间的调用频率。

何时使用函数防抖,何时使用函数节流
当我们只需要处理最后一次触发的事件时,用函数防抖。
当事件触发过于频繁,我们需要限制事件处理程序的调用频率,用函数节流

用vue写函数防抖节流指令


export default {
    install(Vue, Options) {
        /*
         *  防抖,规定时间内(默认300毫秒)最后一次点击有效。
         *  @param {?Number|300} time - 间隔时间,毫秒
         *  @param {Function} fn - 执行函数
         *  @param {?String|"click"} event - 事件类型 例:"click"
         *  @param {Array} binding.value - [fn,event,time]
         *  例:<el-button v-debounce="[resetData,`click`,300]">刷新</el-button>
         *  也可简写成:<el-button v-debounce="[resetData]">刷新</el-button>
         */
        // 注册一个全局自定义指令 `v-debounce`
        Vue.directive('debounce', {
            // 当被绑定的元素插入到 DOM 中时……
            inserted: function (el, binding) {
                //binding.value,使用自定义指令v-debounce时填写的参数
                //解构赋值,定义了3个变量,将参数(数组)按顺序进行赋值
                let [fn, event = "click", time = 300] = binding.value
                let timer
                el.addEventListener(event, () => {
                    //默认监听的事件为click
                    //判断计时器是否存在,存在则清除计时器。重新创建计时器,到时间后执行函数fn
                    if (timer) {
                        clearTimeout(timer)
                    }
                    timer = setTimeout(() => fn(), time)
                })
            }
        })

        /*
         *  节流,规定时间内可点击一次(第一次点击有效)。
         *  @param {?Number|300} time - 间隔时间,毫秒
         *  @param {Function} fn - 执行函数
         *  @param {?String|"click"} event - 事件类型 例:"click"
         *  @param {Array} binding.value - [fn,event,time]
         *  例:<el-button v-throttle="[resetData,`click`,300]">刷新</el-button>
         *  传递参数则:<el-button v-throttle="[()=>resetData(param),`click`,300]">刷新</el-button>
         */
        // 注册一个全局自定义指令 `v-throttle`
        Vue.directive('throttle', {
            // 当被绑定的元素插入到 DOM 中时……
            inserted: function (el, binding) {
                //binding.value,使用自定义指令v-throttle时填写的参数
                //解构赋值,定义了3个变量,将参数(数组)按顺序进行赋值
                let [fn, event = "click", time = 300] = binding.value
                let timer = null;
                el.addEventListener(event, () => {
                    //默认监听的事件为click
                    //判断计时器是否存在,不存在则执行函数fn,创建计时器
                    if (timer == null) {
                        fn();
                        timer = setTimeout(() => timer = null, time)
                    }
                })
            }
        })

        /*
         *  节流方案二,通过禁用html标签,规定时间内可点击一次(第一次点击有效)。
         *  应用在封装的组件中可能无效。
         *  @param {?String|"click"} event - 事件类型 例:"click"
         *  @param {?Number|2000} time - 间隔时间,毫秒
         *  @param {Array} binding.value - [event,time]
         *  例:<button v-throttle-disabled="[]">测试按钮</button>
         */
        //注册一个全局自定义指令 `v-throttle-disabled`
        Vue.directive('throttle-disabled', {
            // 当被绑定的元素插入到 DOM 中时……
            inserted(el, binding) {
                let [event = "click", time = 2 * 1000] = binding.value
                el.addEventListener(event, () => {
                    //默认监听click事件
                    //当 dom元素el 非禁用状态时 将其设置为禁用状态,同时设置计时器,规定时间后(默认2秒)启用。
                    if (!el.disabled) {
                        el.disabled = true
                        setTimeout(() => {
                            el.disabled = false
                        }, time)
                    }
                })
            }
        })
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1411010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解旅游网站开发:Java+SpringBoot+Vue+MySQL的实战经验

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

RocketMQ源码阅读-九-自定义过滤规则Flitersrv

RocketMQ源码阅读-九-自定义过滤规则Flitersrv 什么是FiltersrvFiltersrv注册到Broker过滤类Consumer发起订阅设置过滤类代码Consumer上传过滤类代码Flitersrv编译过滤类代码 过滤消息Consumer 从 Filtersrv 拉取消息Flitersrv从Broker拉取消息 Flitersrv的高可用总结 什么是Fi…

电容主要特点和作用,不同类型的电容区别

电容 两个相互靠近的金属板中间夹一层绝缘介质组成的器件&#xff0c;当两端存在电势差时&#xff0c;由于介质阻碍了电荷移动而累积在金属板上&#xff0c;衡量金属板上储存电荷的能力称之为电容&#xff0c;相应的器件称为电容器。 电容&#xff08;Capacitance&#xff09…

PyTorch 中的nn.Conv2d 类

nn.Conv2d 是 PyTorch 中的一个类&#xff0c;代表二维卷积层&#xff08;2D Convolution Layer&#xff09;。这个类广泛用于构建卷积神经网络&#xff08;CNN&#xff09;&#xff0c;特别是在处理图像数据时。 基本概念 卷积: 在神经网络的上下文中&#xff0c;卷积是一种特…

关于mysql默认禁用本地数据加载的情况处理(秒解决)

1.首先报错信息&#xff1a;ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server sides 2.排查问题&#xff1a; 先检查local_infile的状态&#xff1a;使用sql指令 show global variables like local_infile; 这种情…

Keycloak - docker 运行 前端集成

Keycloak - docker 运行 & 前端集成 这里的记录主要是跟我们的项目相关的一些本地运行/测试&#xff0c;云端用的 keycloak 版本不一样&#xff0c;不过本地我能找到的最简单的配置是这样的 docker 配置 & 运行 keycloak keycloak 有官方(Red Hat Inc.)的镜像&#…

如何在ubuntu22.04安装ROS2

ubuntu22.04安装ROS2 教程 选择对应版本进行安装设置编码添加源安装ROS2设置环境变量 运行ROS2 选择对应版本 通过官方网站&#xff0c;查询Ubuntu与ros对应的版本&#xff0c;版本不一致也会出现安装不成功。 https://wiki.ros.org/ROS/Installation 每一个都可以进行点击&a…

Windows10上使Git Bash支持rsync命令操作步骤

rsync命令是linux上常用的工具之一&#xff0c;用于远程以及本地系统中拷贝/同步文件和文件夹。 Windows Git Bash默认并不支持rsync&#xff0c;如下图所示&#xff1a; 使Git Bash支持rsync命令操作步骤&#xff1a; 1.从https://repo.msys2.org/msys/x86_64/ 下…

flutter-相关个人记录

1、flutter 安卓打包打包报错 flutter build apk -v --no-tree-shake-icons 2、获取华为指纹证书命令 keytool -list -v -keystore ***.jks 3、IOS项目中私有方法查找隐藏文件中 1、cd 项目目录地址 2、grep -r xerbla. "xerbla"为需要查找的关键字 3…

在IDEA中创建SpringBoot项目

概述 SpringBoot是由Pivotal团队提供的全新的框架&#xff0c;其设计的目的是用来简化Spring应用的初始搭建以及开发过程。 传统方式构建Spring应用程序 导入依赖繁琐 依赖冲突 项目配置繁琐 SpringBoot特性 1、起步依赖 本质上就行一个Maven坐标&#xff0c;整合了完成一…

RockChip DRM Display Driver

资料来源: 《Rockchip_DRM_Display_Driver_Development_Guide_V1.0.pdf》 《Rockchip_Developer_Guide_DRM_Display_Driver_CN.pdf》 一:DRM概述 DRM(Direct Rendering Manager)直接渲染管理,buffer分配,帧缓冲。对应userspace库位libdrm,libdrm库提供了一系列友好的…

【NeRF】了解学习Neural Radiance Fields(神经辐射场)

文章目录 1.Definition of field&#xff08;场的定义&#xff09;1.1 shape representations&#xff08;各种形状表征方式&#xff09;1.2 Explicit surfaces and implicit surfaces1.3 Radiance Field(Implicit Surfaces)体素密度 2.Definition of Rendering&#xff08;渲染…

项目解决方案:非执法视频监控系统项目设计方案

目 录 一、概述 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;设计思路 &#xff08;三&#xff09;设计原则 1、实用性 2、可靠性 3、安全性 4、先进性 5、开放性 6、易管理、易维护 &#xff08;四&#xff09;设计依据 二、方案总…

数据可视化的未来:2024 年及以后_光点科技

随着我们进入数据驱动决策的下一个时代&#xff0c;数据可视化领域即将迎来一场变革性革命。随着信息的不断涌入和数据的复杂性不断增加&#xff0c;传统的可视化方法需要帮助跟上步伐。人工智能、机器学习和增强现实等新兴技术正在为新一代实时数据可视化工具铺平道路&#xf…

C语言-算法-线性dp

[USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中&#xff0c;从 7 → 3 → 8 →…

centos手动下载配置redis并自启动

有些服务器不能自动安装配置redis&#xff0c;仓库找不到之类的问题&#xff0c;就需要手动下载配置redis&#xff0c;记录下&#xff0c;方便以后使用&#xff08;ps&#xff0c;如果报错可能是gcc缺失&#xff09; 1、下载 Redis 源码包&#xff1a;访问 Redis 官网或可信的…

前端学习生产环境、开发环境、测试环境

1、路径 定义是什么环境 NODE_ENVdevelopment 开发环境 2、.env 端口号 3、.env.development 开发环境 4、.env.production 生产环境 5、.env.test 测试环境 6、如何访问&#xff0c;通过process.env进行访问 学习中.......

acrobat调整pdf的页码和实际页码保持一致

Acrobat版本 具体操作 现在拿到pdf的结构如下&#xff1a; pdf页码实际页码1-10页无页码数11页第1页 操作&#xff0c;选择pdf第10页&#xff0c;右键点击 具体设置 最终效果

视频渲染靠cpu还是显卡 会声会影视频渲染的作用是什么

视频渲染最占用的资源就是CPU&#xff0c;多核心多线程&#xff0c;这样才能渲染快。渲染可以在时间线上实时平滑预览&#xff0c;便于编辑&#xff0c;最终导出成片的时候速度也会快一些&#xff0c;渲染就是对每桢的图像进行重新优化的过程。 渲染的作用主要是能够保证使用者…

64、ubuntu使用c++/python调用alliedvisio工业相机

基本思想&#xff1a;需要使用linux系统调用alliedvisio工业相机完成业务&#xff0c;这里只做驱动相机调用&#xff0c;具体不涉及业务开发 Alvium 相机选型 - Allied Vision 一、先用软件调用一下用于机器视觉和嵌入式视觉的Vimba X 软件开发包 - Allied Vision VimbaX_Set…