前端面试题(js预编译this指向问题箭头函数中的thisjs深浅拷贝防抖函数节流函数)

Posted 小小白学计算机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端面试题(js预编译this指向问题箭头函数中的thisjs深浅拷贝防抖函数节流函数)相关的知识,希望对你有一定的参考价值。

一、js预编译


二、 this指向问题

  1. 直接函数调用,this指向window
  2. 对象方法调用,this指向调用者

三、箭头函数中的this

四、js深浅拷贝

栈(stack):栈会自动分配内存空间,会自动释放,存放基本类型,简单的数据段,占据固定大小的空间。
基本类型:String,Number,Boolean,Null,Undefined

堆(heap):动态分配的内存,大小不定也不会自动释放,存放引用类型,指那些可能由多个值构成的对象,保存在堆内存中,包含引用类型的变量,实际上保存的不是变量本身,而是指向该对象的指针。
引用类型:Function,Array,Object

  1. 赋值:两个对象都指向同一个地址
  2. 浅拷贝:两个对象指向不同的地址,但是引用数据类型仍然指向相同的地址
  3. 深拷贝:两个对象彼此互不影响

    var person1 = JSON.parse(JSON.stringify(person)):这种方式对Date、RegExp和函数不拷贝



总结:

五、防抖函数

函数防抖:短时间内函数调用,只有第一次或者最后一次有效,中间的都是无效
抖动停止后的时间超过设定的时间时执行一次函数。注意:这里的抖动停止表示你停止了触发这个函数,从这个时间点开始计算,当间隔时间等于你设定时间,才会执行里面的回调函数。如果你一直在触发这个函数并且两次触发间隔小于设定时间,则一定不会到回调函数那一步。


<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<input type="text" id="input">
		
		<script type="text/javascript">
			var input = document.getElementById('input')
			// 防抖的函数
			function debounce(delay, callback) {
				let timer 
			
				return function(value) {
					clearTimeout(timer)
					// 我们想要清除的定时器,那么就应该先存储timer,
					// 让timer一直保存在内存中(使用闭包)
					// 既然不想打印之前已经输入文本框的结果,那么就可以通过
					// 清除以前的定时器来实现
					timer = setTimeout(function() {
						// console.log(value) // 输出了结果,
						// 如果我想让这个结果不在这里输出,而是在这个函数的外面输出
						// 可以使用 回调函数
						callback(value)
					}, delay)
				}
			}
			function fn(value) {
				console.log(value)
			}
			
			// 需求:输入框的结果只输出一次,是在键盘抬起后不在输入后的1s后才输出这次结果
			var debouncFunc = debounce(1000, fn)
			input.addEventListener('keyup', function(e) {
				debouncFunc(e.target.value)
			})
			
			// 闭包: 函数里面return出函数
		</script>
	</body>
</html>

六、节流函数

按照设定的时间固定执行一次函数,比如200ms一次。注意:固定就是你在mousemove过程中,执行这个节流函数,它一定是200ms(你设定的定时器延迟时间)内执行一次。没到200ms,一定会返回,没有执行回调函数的。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<button type="button" id="btn">点击</button>
		<script type="text/javascript">
			// 需求: 不管1s内你点击了多少次,func函数都只执行一次
			function thro(func, wait) {
				let timeOut
				// 节流:相当于是在银行 办理业务,指定时间1s内,
				// 只为一个顾客办理,其他顾客怎么催都不帮它们办理
				// 想让timeOut一直存储在内存中,可以采用闭包
				return function() {
					if(!timeOut) {
						timeOut = setTimeout(function() {
							func()
							// 银行工作人员为顾客办理完业务之后,需要继续为下一个顾客服务
							timeOut = null
						}, wait)
					}
				}
			}
			function handle() {
				console.log(Math.random())
			}
			
			document.getElementById('btn').onclick = thro(handle, 2000)
		</script>
	</body>
</html>

以上是关于前端面试题(js预编译this指向问题箭头函数中的thisjs深浅拷贝防抖函数节流函数)的主要内容,如果未能解决你的问题,请参考以下文章

《2w字大章 38道面试题》彻底理清JS中this指向问题 #yyds干货盘点#

前端面试题总结

面试题系列---箭头函数和普通函数的区别?箭头函数的优缺点?

this 的指向

this 的指向

面试题-JavaScript