• 2017面试题1


    AMD 和 CMD 的区别有哪些?

    区别:

    1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.

    2. CMD 推崇依赖就近,AMD 推崇依赖前置。看代码:

    // CMD
    define(function(require, exports, module) {
    var a = require('./a')
    a.doSomething()
    // 此处略去 100 行
    var b = require('./b') // 依赖可以就近书写
    b.doSomething()
    // ...
    })

    // AMD 默认推荐的是
    define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
    a.doSomething()
    // 此处略去 100 行
    b.doSomething()
    ...
    })

    虽然 AMD 也支持 CMD 的写法,同时还支持将 require 作为依赖项传递,但 RequireJS 的作者默认是最喜欢上面的写法,也是官方文档里默认的模块定义写法。


    3. AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD 里,每个 API 都简单纯粹


    4. 还有一些细节差异,具体看这个规范的定义就好,就不多说了。

    MVC,MVP 和 MVVM

    mvc 

    1. View 传送指令到 Controller
    2. Controller 完成业务逻辑后,要求 Model 改变状态
    3. Model 将新的数据发送到 View,用户得到反

    接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。另一种是直接通过controller接受指令。

    MVP

    模式将 Controller 改名为 Presenter,同时改变了通信方向。

    1. 各部分之间的通信,都是双向的。

    2. View 与 Model 不发生联系,都通过 Presenter 传递。

    3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

    MVVM

    模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。

    唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式

    5 JavaScript内存管理

    JS中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收。

    简单的说,js是这样管理内存的:

     找出那些不再继续使用的变量,然后释放其中占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预设的收集时间),周期性的执行这一操作.

    对垃圾回收算法来说,核心思想就是如何判断内存已经不再使用了。下面介绍两种常见浏览器的垃圾回收算法。

    1 标记清除 (主流做法)

    2 引用计数法,跟踪记录每个值的被引用次数。

     

    JS中Null与Undefined的区别

    在JavaScript中存在这样两种原始类型:Null与Undefined。

    Undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined。
    Null类型也只有一个值,即null。null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。

     7 闭包是什么?闭包如何避免内存循环引用。

    闭包是在某个作用域内定义的函数,它可以访问这个作用域内的所有变量。

    参考 http://blog.csdn.net/liangklfang/article/details/48543917

    方法一、主动设置js对象element为空,打破循环引用

    function assignHandler()

    {
       var element=document.getElementById("div1");
       var id=element.id;
       element.onclick=function() //element的onclick引用了函数funciton,function通过闭包引用了element,照成循环引用
       {
          alert(id+element+sex);
        }
     /*闭包可以监听外部变量的变化,所以这里把element=null,也就是说外部这个变量相当于不存在了,虽然赋值是在闭包后面,闭包也能够检测到!所以匿名函数不会有外部的DOM对象的引用,不会内存泄漏*/
      var sex="female";
      element=null;

    }

    方法二、通过添加另外一个闭包来避免JS对象和DOM对象之间的循环引用

     window.onload=function outerFunction()
    {
      var anotherObj=function innerFunction()
       {
                alert("I have avoided the leak!");
       }
    //通过另外一个闭包来避免JS对象和DOM对象之间的循环引用
      function anotherInnerFunction()
       {
            var obj=document.getElementById("div1");
     //DOM对象引用了anotherObj函数,但是anotherObj函数无法引用DOM对象
            obj.onclick=anotherObj;
      };
      anotherInnerFunction();
    }

    方法三、通过添加另一个函数来避免闭包本身,进而阻止内存泄漏

    window.onload=function()
    {
            var obj=document.getElementById("div1");
            obj.onclick=doesNotLeak;
    }
    //该函数无法访问上面匿名函数中间的obj对象,从而可以阻止内存泄漏!
    function doesNotLeak()
    {
       alert("我已经阻止内存泄漏了!");
    }

    7 解释下浮动和它的工作原理?清除浮动的技巧

    浮动元素脱离文档流,不占据空间。

    1、<div style="clear:both;"></div>

    2、.clearfix:after {content:"."; display:block; height:0; visibility:hidden; clear:both; }   

    .clearfix { *zoom:1; } //为了适配ie6  
    3,设置`overflow`为`hidden`或者auto

    8 iframe
    iframe是一种框架,也是一种很常见的网页嵌入方式,零度今天给大家分析分析它的优缺点。
    iframe的优点:

    1.iframe能够原封不动的把嵌入的网页展现出来。
    2.如果有多个网页引用iframe,那么你只需要修改iframe的内容,就可以实现调用的每一个页面内容的更改,方便快捷。
    3.网页如果为了统一风格,头部和版本都是一样的,就可以写成一个页面,用iframe来嵌套,可以增加代码的可重用。
    4.如果遇到加载缓慢的第三方内容如图标和广告,这些问题可以由iframe来解决。
    iframe的缺点:

    1.会产生很多页面,不容易管理。
    2.iframe框架结构有时会让人感到迷惑,如果框架个数多的话,可能会出现上下、左右滚动条,会分散访问者的注意力,用户体验度差。
    3.代码复杂,无法被一些搜索引擎索引到,这一点很关键,现在的搜索引擎爬虫还不能很好的处理iframe中的内容,所以使用iframe会不利于搜索引擎优化。
    4.很多的移动设备(PDA 手机)无法完全显示框架,设备兼容性差。
    5.iframe框架页面会增加服务器的http请求,对于大型网站是不可取的。
    分析了这么多,现在基本上都是用Ajax来代替iframe,所以iframe已经渐渐的退出了前端开发。

    求y 和 z 的值
    var x =1
    var y = 0
    var z = 0
    function add(n){n=n+1}
    y=add(x)
    function add(n){n=n+3}
    z=add(x)

    underfined
  • 相关阅读:
    有上下界的可行流
    NOIP模拟——change
    NOIP模拟 ———number(假的数位dp)
    18.8.18NOIP模拟。。。。Snow
    字符串算法(KMP,Trie树,AC自动机)
    BZOJ4293 Siano
    NOIP2017 DAY2 T1
    AtCoder Grand Contest 023 D GO Home
    浅谈SPFA(队列优化的Bellman-Ford算法)
    最短路最基本算法———Floyd算法
  • 原文地址:https://www.cnblogs.com/y896926473/p/6651884.html
Copyright © 2020-2023  润新知