js特性回顾的小练习

593 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

目录

今日题

  1. 题目
  2. 分析 昨日题
  3. 题目
  4. 答案
  5. 解析 结语

今日题

题目

写出以下函数的执行结果,输出以单个空格分隔

function Fun() {
    say = function() {
        console.log(1)
    }
    return this
}

Fun.say = function () {
    console.log(2)
}


function say() {
    console.log(3)
}

var say = function() {
    console.log(4)
}

Fun.prototype.say = function () {
    console.log(5)
}

Fun.say()
say()
Fun().say()
new Fun.say()
new Fun().say()
say()

分析

  • Fun上绑定了一些方法,有静态方法,原型方法和函数内部的函数表达式
  • 全局作用域内也有两个同名函数
  • 我们要观察Fun内声明的函数表达式的作用域在那里
  • 还有new这个关键字和()的优先级

昨日题

题目

封装一个防抖请求

答案

 function debounce(fn, time) {
        let timerID;	//(1)
        return function() {	//(2)
            if(timerID) {	//(3)
               clearTimeout(timerID) 
            }
            timerID = setTimeout(() => { //(4)
                fn()	//(5)
            }, time);      
        }
    }

解析

  • 我们知道防抖的核心思想就是单位时间内如果有多次连续的触发,那么就以最后一次为准
  • 所以我们会用到定时器,又因为作用域的问题,我们需要用到闭包
  • 首先,声明一个timerID,后面用它来标记定时器(1)
  • 之后就是直接返回一个函数,也就是闭包(2)
  • 根据timerID的值进行判断,这里也就是防抖的核心
  • timerID绑定一个定时器时,清除当前的定时器(3)
  • 否则,就给timerID绑定一个setTimeout(4)
  • 这样,一个最简单的防抖函数就已经写好
  • 在(5)的位置执行真正的逻辑代码
  • 这样,每次触发事件时,都会先对timerID进行判断,timerID只要有值就会被清楚,然后添加一个新的定时器,这样我们防抖的目的也达到了

结语

此文章已收录至《JavaScript每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。
创作不易,少年,就请留个赞再走吧!