目录
1、什么是防抖,什么是节流?
防抖:在事件被触发时,延迟n秒后再触发回调函数,如果n秒内又触发了事件,则会重新开始计算时间(一定时间内最后一次生效)
应用场景
节流:一段时间内只能触发一次,如果这段时间内触发多次事件,只有第一次生效会触发回调函数,一段时间过后才能再次触发(一定时间内只执行第一次)
防抖:在规定的时间内,不管触发多少次事件,都只会执行最后一次,这种被称为防抖,防抖控制次数
节流:在规定的时间内触发事件,只会执行第一次;节流控制频率
2、如何实现闭包?
闭包:在A函数中创建一个B函数,并且在A函数中返回B函数的引用地址,同时在A函数外面定义变量接收A函数返回的内容
闭包的好处:
1、保护私有变量,不被全局污染
2、延长了变量的生命周期
3、可以让函数内部的变量,在外部访问
缺点:外面函数每调用一次,就会在调用栈保留一个执行空间,调用多了话,可能会造成内存溢出/内存泄漏
3、介绍函数调用时的执行步骤?
函数的两大阶段:定义阶段和调用阶段
定义阶段:
1、在内存开辟空间
2、把函数体中的代码,存放在该空间中
3、把该空间的引用地址,返回给函数名
调用阶段:
1、根据函数名中的引用地址,获取内存中的函数体
2、给形参赋值
3、预解析
4、在内存中再次开辟一个执行空间
5、把存储空间中的代码,拿到执行空间中去执行
6、当执行空间中的代码执行完毕时,销毁执行空间
执行空间不被销毁:当函数中,如果返回一个引用数据类型,并且在函数外调用的位置创建变量接收时,该执行空间不被销毁
注:闭包最主要就是利用了这个函数执行空间不销毁的逻辑
4、let、const和var关键字的区别?
(1)块级作用域: 块作用域由 { }包括,let和const具有块级作用域,var不存在块级作用域。块级作用域解决了ES5中的两个问题:
● 内层变量可能覆盖外层变量
● 用来计数的循环变量泄露为全局变量
(2)变量提升: var存在变量提升,let和const不存在变量提升,即在变量只能在声明之后使用,否在会报错。
(3)给全局添加属性: 浏览器的全局对象是window,Node的全局对象是global。var声明的变量为全局变量,并且会将该变量添加为全局对象的属性,但是let和const不会。
(4)重复声明: var声明变量时,可以重复声明变量,后声明的同名变量会覆盖之前声明的遍历。const和let不允许重复声明变量。
(5)暂时性死区: 在使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区。使用var声明的变量不存在暂时性死区。
(6)初始值设置: 在变量声明时,var 和 let 可以不用设置初始值。而const声明变量必须设置初始值。
(7)指针指向: let和const都是ES6新增的用于创建变量的语法。 let创建的变量是可以更改指针指向(可以重新赋值)。但const声明的变量是不允许改变指针的指向。
5、箭头函数和普通函数的区别?
1 箭头函数比普通函数更加简洁
2 箭头函数没有自己的this
3 箭头函数继承来的this指向永远不会改变
4 call()、apply()、bind()等方法不能改变箭头函数中this的指向
5 箭头函数不能作为构造函数使用
6 箭头函数没有自己的arguments
7 箭头函数没有prototype