1、什么是闭包?
js的变量可以分为 全局变量 和 局部变量。
全局变量:函数内部可以访问到全局变量;
局部变量:函数内部的变量,外部访问不到。
闭包:就是能够读取其他函数内部变量的函数。
最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
例子:
function f1(){ var n=999; function f2(){ alert(n); // 999 } }
var result=f1();
result(); // 999
可以通过调用内部函数,得到内部变量值,这就是闭包。
闭包的缺点:
1.闭包会使得函数内部的变量都被保存在内存中,内存消耗很大,不能滥用闭包,否则会造成网页性能问题。 解决办法:在退出函数之前,将不再使用的局部变量清除。 2.闭包会在父函数外部,改变父函数内部变量的值。
2、undefined 和 null 的区别 ?
undefined和null都表示 值的空缺; undefined:可以认为是系统的、出乎意料的或类似错误的值的空缺; null:表示程序化的、正常的、或者意料之中的空缺。
3、http和https有什么区别?
http是HTTP协议运行在TCP之上。所有传输内容都是明文,客户端和服务端都无法验证对方身份。 https是HTTP协议运行在SSL/TLS之上的,SSL/TCL是运行在TCP之上的。 所有传输内容都是加密的,加密采用对称加密,但对称加密的秘钥用服务器方的证书进行了非对称加密。 客户端可以验证服务器端的身份,如果配置了客户端验证,那么服务器也可以验证客户端身份。
4、优雅降级和渐进增强?
也就是 向上兼容和向下兼容浏览器的概念。
优雅降级:一开始就构建站点的完整功能,然后针对浏览器测试和修复。比如一开始使用css3的特性构建了一个应用,然后逐步针对各大浏览器进行hack使其可以在低版本浏览器正常浏览。 其实也就是 适配低版本的浏览器页面。 渐进增强:一开始对低版本的浏览器进行构建页面,完成基本的功能,然后在针对高等级浏览器进行效果、交互、功能的追加,达到更好的体验。
5、eval()的作用?
把字符串解析成js代码并运行,并返回执行结果。
6、什么是内存泄露 和 垃圾回收机制?
程序的运行需要内存。对于持续运行的服务器进程,必须要释放不需要的内存。否则内存越来越高,会影响性能或者崩溃。
内存泄露:不再利用的内存,没有及时释放,就叫做内存泄露。
垃圾回收:自动管理内存,清理不可用对象,已到达释放内存的目的。
最经常使用的方法:引用计数,保存了内存里面的所有的资源的引用次数。如果一个值的引用次数为0,则表示这个值不再用到了,可以将内存释放了。
可达性算法,也就是构建树结构,一个对象正在使用就是可达,就不可回收。
哪些操作会造成内存泄露?
意外的全局变量 闭包引起 没有清理的dom元素 被遗忘的定时器或者回调函数 子元素存在引起的内存泄露
7、JS事件冒泡和JS事件委托?
事件冒泡:
事件冒泡:当一个元素接收到事件的时候,会把他接收到的事件传递给父级。
例如:
<ul>
<li>点击</li>
</ul>
当点击 li的时候,父级ul的点击事件也会被触发。
阻止事件冒泡的方法:e.stopPropagation()
非标准的IE模式:window.event.cancelBulle = true;
事件委托:
事件委托:也叫事件代理。就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。
为什么使用事件委托?
1、在JavaScript中,添加到页面上的事件处理程序的数量将直接关系到页面的运行性能。因为需要不断与dom节点进行访问,访问的次数越多,引起浏览器重绘和重排的次数也会越多, 就会影响整个页面的交互就绪时间,这就是为什么性能优化的主要思想之一就是减少dom操作。 如果利用事件委托,就会把所有的事件放到js里面,与dom的交互操作只有一次,就大大减少了与dom交互次数,提高性能。
2、节省内存。
每个函数都是对象,如果不使用事件委托的话,有几个事件就会占用多少个内存。如果使用事件委托的话,那我们就可以只对父级这一个对象进行操作,只需要占用一个内存空间,可以提高性能。
事件委托的最经典的作用?
就是利用事件委托的方法,给新添加的子元素是带有事件效果的。 在用事件委托的时候,根本不需要遍历所有元素的子节点,只需要给父级添加事件就可以了,其他的都在js里面运行的。 这样就大大减少了dom操作。
参考:https://blog.csdn.net/qq_38290251/article/details/88026540