持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
目录
今日题
题目
写出以下函数的执行结果,输出以单个空格分隔
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每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。创作不易,少年,就请留个赞再走吧!