JS高级应用--防抖、节流、数组扁平化、柯里化、对象拷贝

JS高级应用--防抖、节流、数组扁平化、柯里化、对象拷贝

防抖

浏览器resize、scroll、keypress、mousemove等事件触发时,会不断的调用绑定在事件上的回调函数,浪费资源、降低性能,为了优化体验,对这类事件调用次数限制。
作用:在短时间内多次触发同一函数,只执行最后一次,或者只在开始执行。
例:用户拖拽改变窗口大小,触发resize事件。

function debounce(func, delay, immediate) {
	var timer = null;
	return function(){
		var context = this;
		var args = arguments;
		if(timer) clearTimeout(timer);
		if(immediate) {
			var doNow = !timer;
			timer = setTimeout(function(){
				timer = null;
			},delay);
			if(doNow){
				func.apply(context, args);
			}
		}else{
			timer = setTimerout(function(){
				func.apply(context, args);
			}, delay)
		}
	}
}

应用示例

var run = function() {
	console.log("I'm run")
}
window.addEventListener('resize', debounce(run,2000))

节流

交流是指在一段时间内只允许函数执行一次
应用场景:输入框的联想,可以限定客户在输入时,只在每两秒响应一次(或两秒发送一次搜索请求)

var throttle = function(func, delay){
	var timer = null;
	return function(){
		var context = this;
		var args = arguments;
		if(!timer){
			timer = setTimeout(function(){
				func.apply(context, args);
				timer = null;
			},delay);
		}
	}
}

数组扁平化

function flatten(array, depth = 1) {
	let result = [];
	array.forEach(item=>{
		let d = depth;
		if(Array.isArray(item) && d>0){
			result.push(...(flatten(item, --d)))
		} else {
			result.push(item)
		}
	})
	return result
}

柯里化

function curry(func) {
	var l = func.length;
	return function curried() {
		var args = [].slice.call(arguments);
		if (args.length < 1) {
			return function() {
				var argsInner = [].slice.call(arguments)
				return curried.apply(this, args.contact(argsInner))
			}
		} else {
			return func.apply(this, args)
		}
	}
}
var f = function(a, b, c) {
	return console.log([a, b, c])
}
var curried = curry(f);
curried(1)(2)(3)

对象拷贝

function clone(value, isDeep) {
	if (value === null) return null;
	if (typeof value !== 'object') return value
	if (Array.isArray(value)) {
		if (isDeep) {
			return value.map(item => clone(item, true))
		}
		return [].concat(value)
	} else {
		if (isDeep) {
			var obj = {}
			Object.keys(value).forEach(item => {
				obj[item] = clone(value[item], true)
			})
			return obj
		}
		return { ...value }
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值