• 面试题:JavaScript(一)


    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

     

      

  • 相关阅读:
    2018CCPC网络赛A(优先队列,思维)
    2017BAPC初赛A(思维,无序图,向量)
    2018杭电多校第三场1007(凸包,极角排序)
    2018杭电多校第二场1003(DFS,欧拉回路)
    2017乌鲁木齐区域赛K(容斥原理【求指定区间内与n互素的数的个数】)
    删除特定字符
    Error: An App ID with identifier "*****" is not avaliable. Please enter a different string.
    The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.问题解决
    生命周期图
    Mac 如何恢复出厂设置
  • 原文地址:https://www.cnblogs.com/liumcb/p/13949239.html
Copyright © 2020-2023  润新知