当前位置: 首页 > Web前端 > HTML

访谈结束

时间:2023-03-28 19:04:04 HTML

1.什么是闭包?我们要说的是作用域,作用域链,变量提升,临时死区,执行上下文等作用域:变量放在哪里,如何访问和修改的一套规则在js编译阶段,遍历作用域进行检查当前变量是否存在。如果存在,则忽略该变量并继续下一个。如果不存在,则在执行阶段在当前作用域中创建一个变量,并在当前作用域中查找该变量。如果找不到,它会在父作用域中查找,直到最外层的JS有三个作用域:全局作用域:全局定义的变量有这个作用域函数作用域:函数内定义的变量有这个作用域块级作用域:let,const{}中定义的变量具有此范围。使用var声明的变量可以在块级范围之外访问,即使它们是在块级范围内定义的。let,const有一个暂时的死区。两者都在定义它们的块级范围内,在定义之前无法访问它们。(var可以,会初始化为undefiend)varme='xiuyan';{me='bear';letme;}错误原因:块级作用域内有let和const定义的变量,old在作用域的开头会形成一个暂时的死区,不会去外层查找变量是否存在作用域链:作用域之间存在嵌套关系,形成作用域链闭包:它存在于函数中,既不是函数参数也不是函数参数。一个不是函数局部变量的变量,这个函数是闭包词法作用域和动态作用域词法作用域:作用域链沿着定义的位置延伸,js的动态作用域:作用域链沿着调用栈延伸如何修改js中的eval:将一个字符串转换成js代码执行宽度:会创建一个单独的作用域,决定不使用它们来写代码2.看代码,说出结果for(vari=0;i<5;i++){setTimeout(function(){console.log(i);},1000);}结论:45个原因:setTimout延迟执行,如果定义的函数中没有i,它会寻找外层作用域,在这个时候我已经是5了如何改造:-使用setTimout的第三个参数for(vari=0;i<5;i++){setTimeout(function(j){console.log(j);},1000,i);}-使用函数缓存变量(vari=0;i<5;i++){(function(j){setTimeout(function(){console.log(i);},1000);})(i)}vara=1;函数测试(){a=2;返回函数(){console.log(a);}vara=3;}test()();result:2reason:vara=3isdefinedbyvariableImproved,测试里面的函数会在它的作用域内使用a变量,所以是2.注意是函数定义的位置,不是它所在的地方用于查找外层。3、开发中的应用实现私有变量:部分相对私有的变量只想在对象内部生效,不能被外部访问,实现偏函数和柯里化:一种可以将多入参函数转化为少入参函数的方法functiongenerateName(prefix,type,itemName)when{returnprefix+type+itemName}时,第一和第二个参数可能经常是固定变量,然后可以柯里化functiongenerateName(prefix){returnfunction(type){returnfunction(itemName){}}}//生成独占函数varcountryName=generateName('China')//使用独占函数varcityName=countryName('Guangdong')('Guangzhou')将柯里化所有参数拆分为一个,部分函数为比较随意,可以分为不同的,例如:functiongenerateName(prefix){returnfunction(type,itemName){returnprefix+type+itemName}}//生成一个专用函数varcountryName=generateName('China')//使用独占函数varcityName=countryName('广东','广州')4.是否会造成内存泄漏正确使用不会造成内存泄漏,接下来介绍内存管理和内存js泄漏4.1。内存管理内存的分配:挖坑,根据不同的类型分配不同的内容js基本类型:string,number,boolean,undefined,null,symbol。占用空间固定,体积轻。存储在栈内存中。js复杂类型:Object.占用空间的大小不固定。存储在堆内存中。读写内存:使用pitjs基本类型:获取变量时直接从栈中取值。js复杂类型:获取时先从栈内存中获取对象的引用(堆内存中的地址),然后查询堆内存获取具体数据。释放内存:还是坑,垃圾回收引用计数方式:现代浏览器不再使用这种方式。容易出现内存泄漏的Mark-and-sweep方法:从window对象开始,扫描所有可以通过root对象到达的变量,标记为'reachable'。遍历所有对象清除未标记的对象并将标记恢复为默认值。回收对应空间的缺点:回收的对象在地址上是不连续的,导致空间被回收,但是不连续,导致后续分配的空间使用不善,造成空间浪费。并且不会立即收集垃圾对象。标记方法:标记阶段相同;空间在清除前会进行排序,移动位置,使释放的空间在一个连续的空间中。年轻代(存活时间短,占比小)+老年代。在新生代(from+to)中,存活的从from移动到to,非存活的释放;然后交换位置;如果超过25%,则放在老年代。老年代:把活着的移到一边;清除边界外的一切;在实践中做了一些优化:遍历一个对象可能需要很长时间,执行时有一定的延迟。因此,引擎会把垃圾回收分解成几个部分,每个部分单独执行,以减少延迟。为了减少对执行的影响,垃圾收集只在CPU空闲时运行4.2。内存泄漏意外的全局变量不清除setInterval,连续setTimout不删除对DOM的引用