zoukankan      html  css  js  c++  java
  • 三、$JavaScript(1)

    1、闭包

    • 闭包就是能够读取其他函数内部变量的函数

    • 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域

    • 闭包的特性:

      • 函数内再嵌套函数
      • 内部函数可以引用外层的参数和变量
      • 参数和变量不会被垃圾回收机制回收

    说说你对闭包的理解

    • 使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念

    • 闭包 的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中

    • 闭包的另一个用处,是封装对象的私有属性和私有方法

    • 好处:能够实现封装和缓存等;

    • 坏处:就是消耗内存、不正当使用会造成内存溢出的问题

    使用闭包的注意点

    • 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露

    • 解决方法是,在退出函数之前,将不使用的局部变量全部删除

    2、说说你对作用域链的理解

    • 作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的

    • 简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期

    3、JavaScript原型,原型链 ? 有什么特点?

    • 每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时

    • 如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这prototype又会有自己的prototype,于是就这样一直找下去,也就是我们平时所说的原型链的概念

    • 关系:instance.constructor.prototype = instance.__proto__

    • 特点:

      • JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变
    • 当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 如果没有的

    • 就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 内建对象

    4、请解释什么是事件代理

    • 事件代理(Event Delegation),又称之为事件委托。是 JavaScript 中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是可以提高性能

    • 可以大量节省内存占用,减少事件注册,比如在table上代理所有tdclick事件就非常棒

    • 可以实现当新增子对象时无需再次对其绑定

    5、Javascript如何实现继承?

    • 构造继承

    • 原型继承

    • 实例继承

    • 拷贝继承

    • 原型prototype机制或applycall方法去实现较简单,建议使用构造函数与原型混合方式

     function Parent(){
            this.name = 'wang';
        }
    
        function Child(){
            this.age = 28;
        }
        Child.prototype = new Parent();//继承了Parent,通过原型
    
        var demo = new Child();
        alert(demo.age);
        alert(demo.name);//得到被继承的属性
      }

    6、谈谈This对象的理解

    • this总是指向函数的直接调用者(而非间接调用者)
    • 如果有new关键字,this指向new出来的那个对象
    • 在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window

    7、事件

    • 冒泡型事件:当你使用事件冒泡时,子级元素先触发,父级元素后触发

    • 捕获型事件:当你使用事件捕获时,父级元素先触发,子级元素后触发

    • DOM事件流:同时支持两种事件模型:捕获型事件和冒泡型事件

    • 阻止冒泡:在W3c中,使用stopPropagation()方法;在IE下设置cancelBubble = true

    • 阻止捕获:阻止事件的默认行为,例如click - <a>后的跳转。在W3c中,使用preventDefault()方法,在IE下设置window.event.returnValue = false

    8、new操作符具体干了什么呢?

    • 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型

    • 属性和方法被加入到 this 引用的对象中

    • 新创建的对象由 this 所引用,并且最后隐式的返回 this

    9、Ajax原理

    • Ajax的原理简单来说是在用户和服务器之间加了—个中间层(AJAX引擎),通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。使用户操作与服务器响应异步化。这其中最关键的一步就是从服务器获得请求数据

    • Ajax的过程只涉及JavaScriptXMLHttpRequestDOMXMLHttpRequestajax的核心机制

    // 1. 创建连接
        var xhr = null;
        xhr = new XMLHttpRequest()
        // 2. 连接服务器
        xhr.open('get', url, true)
        // 3. 发送请求
        xhr.send(null);
        // 4. 接受请求
        xhr.onreadystatechange = function(){
            if(xhr.readyState == 4){
                if(xhr.status == 200){
                    success(xhr.responseText);
                } else { // fail
                    fail && fail(xhr.status);
                }
            }
        }

    ajax 有那些优缺点?

    • 优点:

      • 通过异步模式,提升了用户体验.
      • 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用.
      • Ajax在客户端运行,承担了一部分本来由服务器承担的工作,减少了大用户量下的服务器负载。
      • Ajax可以实现动态不刷新(局部刷新)
    • 缺点:

      • 安全问题 AJAX暴露了与服务器交互的细节。
      • 对搜索引擎的支持比较弱。
      • 不容易调试。

    10、如何解决跨域问题?

    • jsonp、 iframewindow.namewindow.postMessage、服务器上设置代理页面

    11、模块化开发怎么做?

    • 立即执行函数,不暴露私有成员
    var module1 = (function(){
        var _count = 0;
        var m1 = function(){
          //...
        };
        var m2 = function(){
          //...
        };
        return {
          m1 : m1,
          m2 : m2
        };
      })();

    12、异步加载JS的方式有哪些?

    • defer,只支持IE

    • async

    • 创建script,插入到DOM中,加载完毕后callBack

    13、那些操作会造成内存泄漏?

    • 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在

    • setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏

    • 闭包使用不当

    14、XMLJSON的区别?

    • 数据体积方面

      • JSON相对XML来讲,数据的体积小,传递的速度更快些。
    • 数据交互方面

      • JSONJavaScript的交互更加方便,更容易解析处理,更好的数据交互
    • 数据描述方面

      • JSON对数据的描述性比XML较差
    • 传输速度方面

      • JSON的速度要远远快于XML

    15、谈谈你对webpack的看法

    • WebPack 是一个模块打包工具,你可以使用WebPack管理你的模块依赖,并编绎输出模块们所需的静态文件。它能够很好地管理、打包Web开发中所用到的HTMLJavascriptCSS以及各种静态文件(图片、字体等),让开发过程更加高效。对于不同类型的资源,webpack有对应的模块加载器。webpack模块打包器会分析模块间的依赖关系,最后 生成了优化且合并后的静态资源

    16、说说你对AMDCommonjs的理解

    • CommonJS是服务器端模块的规范,Node.js采用了这个规范。CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD规范则是非同步加载模块,允许指定回调函数

    • AMD推荐的风格通过返回一个对象做为模块对象,CommonJS的风格通过对module.exportsexports的属性赋值来达到暴露模块对象的目的

    17、常见web安全及防护原理

    • sql注入原理

      • 就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
    • 总的来说有以下几点

      • 永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等
      • 永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取
      • 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接
      • 不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息

    XSS原理及防范

    • Xss(cross-site scripting)攻击指的是攻击者往Web页面里插入恶意html标签或者javascript代码。比如:攻击者在论坛中放一个看似安全的链接,骗取用户点击后,窃取cookie中的用户私密信息;或者攻击者在论坛中加一个恶意表单,当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户原本以为的信任站点

    XSS防范方法

    • 首先代码里对用户输入的地方和变量都需要仔细检查长度和对<”,”>”,”;”,”等字符做过滤;其次任何内容写到页面之前都必须加以encode,避免不小心把html tag 弄出来。这一个层面做好,至少可以堵住超过一半的XSS 攻击

    XSSCSRF有什么区别吗?

    • XSS是获取信息,不需要提前知道其他用户页面的代码和数据包。CSRF是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。要完成一次CSRF攻击,受害者必须依次完成两个步骤

    • 登录受信任网站A,并在本地生成Cookie

    • 在不登出A的情况下,访问危险网站B

    CSRF的防御

    • 服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数
    • 通过验证码的方法

    18、用过哪些设计模式?

    • 工厂模式:

      • 工厂模式解决了重复实例化的问题,但还有一个问题,那就是识别问题,因为根本无法
      • 主要好处就是可以消除对象间的耦合,通过使用工程方法而不是new关键字
    • 构造函数模式

      • 使用构造函数的方法,即解决了重复实例化的问题,又解决了对象识别的问题,该模式与工厂模式的不同之处在于
      • 直接将属性和方法赋值给 this对象;

    19、为什么要有同源限制?

    • 同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议

    • 举例说明:比如一个黑客程序,他利用Iframe把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。

    20、offsetWidth/offsetHeight,clientWidth/clientHeightscrollWidth/scrollHeight的区别

    • offsetWidth/offsetHeight返回值包含content + padding + border,效果与e.getBoundingClientRect()相同

    • clientWidth/clientHeight返回值只包含content + padding,如果有滚动条,也不包含滚动条

    • scrollWidth/scrollHeight返回值包含content + padding + 溢出内容的尺寸

  • 相关阅读:
    个推微服务网关架构实践
    NB-IoT 的“前世今生”
    个推基于Consul的配置管理
    个推Node.js 微服务实践:基于容器的一站式命令行工具链
    个推用户画像的实践与应用
    TensorFlow分布式实践
    个数是如何用大数据做行为预测的?
    QCon技术干货:个推基于Docker和Kubernetes的微服务实践
    基于CMS的组件复用实践
    数据可视化:浅谈热力图如何在前端实现
  • 原文地址:https://www.cnblogs.com/Strugglinggirl/p/11045374.html
Copyright © 2011-2022 走看看