/* js 相关的工具函数 */

/**
 * @description [throttle 节流函数]
 * @author shanshuizinong
 * @param {Function} fn 延时调用函数
 * @param {Number} delay 延迟多长时间
 * @param {Number} atleast 至少多长时间触发一次
 * @return {Function} 延迟执行的方法
 */
export function throttle(fn, delay = 1000, atleast = 1000) {
	let timer = null
	let previous = null
	return function() {
		let now = +(new Date())
		const args = arguments
		const ctx = this
		if (!previous) previous = now
		if (atleast && now - previous > atleast) {
			fn && fn.apply(ctx, args)
			previous = now
			clearTimeout(timer)
		} else {
			clearTimeout(timer)
			timer = setTimeout(function() {
				fn && fn.apply(ctx, args)
				previous = null
			}, delay)
		}
	}
}

//防抖
function debounce(fun, delay) {
	return function(args) {
		//获取函数的作用域和变量
		let that = this
		let _args = args
		//每次事件被触发，都会清除当前的timeer，然后重写设置超时调用
		clearTimeout(fun.id)
		fun.id = setTimeout(function() {
			fun.call(that, _args)
		}, delay)
	}
}


export function uuid() {
	var s = [];
	var hexDigits = "0123456789abcdef";
	for (var i = 0; i < 36; i++) {
		s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
	}
	s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
	s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
	s[8] = s[13] = s[18] = s[23] = "-";

	var uuid = s.join("");
	return uuid;
}

