2024-01-22 15:10:49
总结:
防抖和节流实现的原理(闭包):
防抖(debounce):
原理:在事件被触发后,延迟执行函数,如果在延迟时间内再次触发事件,则重新计时。
闭包应用:使用闭包保存定时器变量timer,确保每次调用debounce函数时都能访问到同一个timer。
代码示例:
function debounce(fn, wait) { let timer = null; return function(...args) { if (timer) clearTimeout(timer); timer = setTimeout(() => fn.apply(this, args), wait); };}节流(throttle):
原理:在事件持续触发的过程中,确保函数在一定时间间隔内只执行一次。
闭包应用:同样使用闭包保存定时器变量timer,通过判断timer是否存在来控制函数执行频率。
代码示例:
function throttle(fn, wait) { let timer = null; return function(...args) { if (!timer) { timer = setTimeout(() => { fn.apply(this, args); timer = null; }, wait); } };}解决边框1px像素问题:
使用伪元素(:after或:before)创建边框。
通过transform: scaleY(0.5)对边框进行缩放,使其看起来更细。
代码示例:
.box { position: relative; width: 100px; height: 100px; border: none; background-color: pink;}.box:after { content: ''; position: absolute; bottom: 0; background: #000; width: 100%; height: 1px; transform: scaleY(0.5); transform-origin: 0 0;}属性遍历:
使用Object.keys()获取对象自身可枚举属性组成的数组。
结合hasOwnProperty()方法判断属性是否为对象自身属性。
代码示例:
function iterate(obj) { let arr = []; Object.keys(obj).forEach(key => { if (obj.hasOwnProperty(key)) { arr.push(`${key}: ${obj[key]}`); } }); return arr;}var C = function() { this.foo = 'bar'; this.baz = 'bim';};C.prototype.bop = 'bip';console.log(iterate(new C())); // 输出: ["foo: bar", "baz: bim"]注意:Object.keys()不会获取原型链上的属性,因此在这个例子中,bop属性不会被遍历到。如果需要遍历包括原型链上的所有可枚举属性,可以使用for...in循环。