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

这篇具有很好参考价值的文章主要介绍了前端面试题-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对象)流向目标节点,途中会经过目标节点的各个父级节点,并在这些节点上触发捕获事件,直至到达文档根节点。(下图点击的粉色方块)
前端面试题-js-new关键字-this指向-js事件流-防抖节流,前端面试题,前端,javascript,开发语言

事件冒泡(event bubbling):由网景公司提出,与捕获时间相反,世界会从目标节点流向文档的根元素节点,途中会经过目标节点的各个父级节点,并在这些节点上触发捕获事件,直至到达文档的根节点。整个过程就像水中的奇葩一样,从水底向上运动。(下图点击的浅粉色方块)
前端面试题-js-new关键字-this指向-js事件流-防抖节流,前端面试题,前端,javascript,开发语言
W3C为了统一标准,采用了折中的方式,即将事件捕获与事件冒泡合并,也就是现在的先捕获后冒泡。

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

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

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

防抖节流函数

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

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

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

用vue写函数防抖节流指令文章来源地址https://www.toymoban.com/news/detail-824522.html


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)
                    }
                })
            }
        })
    }
}

到了这里,关于前端面试题-js-new关键字-this指向-js事件流-防抖节流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# this关键字的作用

    在C#中, this 有以下几种主要作用: 引用当前对象: this  用于引用当前类的实例。可以通过  this  来访问当前对象的成员变量、方法和属性。 区分字段与局部变量:当成员变量和局部变量同名时,可以使用  this  来区分。 在构造函数中调用其他构造函

    2024年02月22日
    浏览(51)
  • Java编程练习之this关键字

    当类中的成员变量与成员方法中的参数重名时,会导致方法无法直接使用成员变量。 示例:创建demo类,定义一个成员变量name并赋初值,再定义一个成员方法showName(String name),输出方法中name的值。代码如下: package zhtestdemo; public class demo {  //创建类,类名叫demo /**/     Str

    2024年01月22日
    浏览(59)
  • Java 对象创建流程、this 关键字

    2024年02月12日
    浏览(48)
  • 面向对象编程(进阶)1:关键字:this

    目录 1.1 this是什么? 1.2 什么时候使用this 1.2.1 实例方法或构造器中使用当前对象的成员 举例1: 举例2: 测试类: 1.2.2 同一个类中构造器互相调用 注意: 1.3 练习 **练习1:** 练习2: 在Java中,this不算难理解,它的作用和其词义很接近。 它在方法(准确的说是实例方法

    2023年04月13日
    浏览(46)
  • this关键字的四种用法

    表示对象自己的属性使用this调用成员变量,解决变量与局部变量之间的冲突问题 代码如下(示例): 代码如下(示例): 控制台运行结果: 分析:为什么会出现这种情况呢?当我们调用构造方法所传递的三个参数值“张三”、20和178.5最终并没有赋值到对象的三个属性中。

    2023年04月22日
    浏览(47)
  • 深入理解C#泛型:new与where关键字全解析

    C#泛型中new和where是重要的,它们都可以用于约束泛型类型参数的限制;它们都用于提高代码的安全性和可用性,它们的作用在很大程度上提高了代码的可读性和可维护性。在这篇文章中,我们将一起了解泛型中的new和where,以及它们之间的区别。 1. new 在C#泛型中

    2023年04月25日
    浏览(38)
  • JavaSE基础(19) super,this 关键字

    子类对象的创建过程: 子类的构造方法中,默认先调用父类的无参构造方法。如果没有显示的调用,那么隐含着super()。         可以访问父类的属性         可以访问父类的方法         指代父类的构造方法, 如果有多个,靠参数来区分。要在第一行。      

    2023年04月10日
    浏览(37)
  • 【Java 基础】构造方法和 this 关键字详解

    《 Java 零基础入门到精通 》 专栏持续更新中。通过本专栏你将学习到 Java 从 入门 到 进阶 再到 实战 的全套完整内容,所有内容均将集中于此专栏。无论是初学者还是有经验的开发人员,都可从本专栏获益。 订阅专栏后添加我微信或者进交流群,进群可找我领取 前端/Java

    2023年04月14日
    浏览(46)
  • 安全初级—正则表达式、This关键字、闭包

    字面量字符 某个字符只表示它字面的含义,例如 /a/ 匹配 a , /b/ 匹配 b 。 元字符 (1)点字符(.) 点字符可以匹配除回车( r )、换行( n )、行分隔符( u2028 )和段分隔符( u2029 )以外的所有字符。 同时,点字符对于码点大于 0xFFFF 字符也不能正确的匹配,会认为这是两个字符

    2024年02月15日
    浏览(43)
  • Java 面向对象 03 就近原则和this关键字

    对于起名字需要见名知意,所以这个String n 不太合适: 但是如果将n改为name,会与第五行代码的name重复: 运行代码发现,获取后的姓名为默认值,是null 引入就近原则: 此处打印的是age=10,但是如果想使用成员位置的age ,应该使用this 代码: 运行结果: 使用this关键

    2024年01月21日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包