一、谈谈你对闭包的理解
简单来说,闭包的本质就是在一个函数内部创建另一个函数
闭包的三大优点: 1.闭包可以保护函数内部的变量名,避免命名冲突 2.闭包可以使用函数内部的变量,使得使用的变量不会被垃圾回收机制回收 3.内部函数可以访问函数外部的变量
缺点: 1.因为被引用的函数不会被垃圾回收机制回收,就会增大内存消耗,造成内存泄漏。 解决方法:在函数退出之前,把引用过的且不再使用的变量都删除,或者把他们设置为null
2.闭包涉及跨域问题,他会导致性能损失。 解决方法:把涉及跨作用域的变量储存在局部变量中,然后直接去访问局部变量,这样就可以减轻对执行速度的影响
二、谈谈你对内存泄漏的理解
内存泄漏指不再用到的资源没有及时得到释放
导致内存泄漏的情况: 1.意外的全局变量。调用完函数后,变量却没有被回收,导致内存泄漏。 解决方法:使用严格模式,因为在严格模式会阻止创建意外的全局变量
2.闭包。闭包内引用的变量没有得到释放,导致内存泄漏。 解决方法:在函数退出之前,把引用过的且不再使用的变量都删除,或者把他们设置为null
3.未清除dom元素的引用。dom元素移除,但对dom元素的引用未被清除,导致内存泄漏
4.定时器。通过计时器注册某个回调函数,而回调函数中存在某个dom元素或者被引用的变量时,即使页面被销毁,定时器也无法被正常回收,就导致内存泄漏,因此需要手动去释放这些计时器
三、解决跨域的方法
(后三种方法了解即可) 1.jsonp 网页可以通过添加一个script元素,向服务器请求json数据,服务器收到请求后通过一个指定的回调函数的参数传回来 2.cors 它是通过自定义请求头和浏览器进行沟通的。如果只是普通跨域,只需在服务端设置(允许访问控制来源)assess-control-allow-origin,而带cookie的跨域则在前后端都在进行设置,前端设置xhr.withCredentials=true,后端设置(允许访问控制凭据)assess-control-allow-credentials 3.nginx代理跨域 使用nginx模拟一个虚拟的服务器,因为服务器与服务器之间不存在跨域的问题。发送请求:客户端>nginx>服务端,返回数据:服务端>nginx>客户端 4.window.name+ifame 5.location.hash+ifame 6.document.domain
|