美文网首页
第十二天

第十二天

作者: 流觞小菜鸟 | 来源:发表于2019-11-28 10:13 被阅读0次

    1,什么是函数柯里化及使用场景?

    柯里化(Currying)是从数学里借用过来的编程语言技法(基于20世纪Haskell Curry等数学家的研究成果)。柯里化指的是从一个多参数函数变成一连串单参数函数的变换。它描述的是变换的过程,不涉及变换之后对函数的调用。调用者可以决定对多少个参数实施变换,余下的部分将衍生为一个参数数目较少的新函数。这个新的函数接收剩下的参数,其内部则指向原始函数。当提供的参数完整了才会最终执行原始函数

    两个细节

    只有一个参数,并且这个参数是该函数的第一个参数。必须按照参数的定义顺序来调用柯里化函数。

    柯里化函数的函数体只会执行一次,只会在调用完最后一个参数的时候执行柯里化函数体

    应用场景

    函数工厂

    想象下面向对象编程里的工厂方法。如果有一个工厂返回的是函数,那就正适合柯里化了

    隐含参数

    当我们需要频繁调用一个函数,而每次参数的值都差不多的时候,可以运用柯里化来设置隐含参数。

    2,JS单线程和多线程?

     问题:js是单线程的,页面是从上往下加载的,那么是不是第一个js没加载完成,第二个js就不加载?然后,引申出来一个问题就是,那css和图片呢?这之间的加载有相互影响吗?

    1、什么是线程?什么是进程?什么是单线程?什么是多线程?

      线程是:程序中一个单一的顺序控制流程。每个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。  进程是:资源分配的基本单位,拥有一个完成的虚拟地址空间。他与线程的关系就是:当进程发生调度时,不同的进程用有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。  多线程是:在单个程序中同时运行多个线程完成不同的工作。

    2、线程的有哪几种状态?

      a)、新建状态:新建一个线程对象;

     b)、就需状态:除了需要CPU的使用权以外,其他运行所需要的资源全部都已经获得。正所谓,万事俱备只欠东风;

    c)、运行状态:就需状态的线程获得了CPU的使用权,开始执行程序代码;

     d)、阻塞状态:运行状态的线程,因为种种原因放弃了CPU的使用权,暂时停止运行,直到再次准备就需进入就需状态,才有机会获得CPU的使用权,接着执行程序;

    e)、死亡状态:线程执行完成,或者出现异常导致意外退出,该线程结束了生命周期。

    3、js是单线程的  js是单线程,指的是js在运行时,同一个时间只能处理一个事情。因此才有了事件队列的概念,前一个任务结束后才会执行下一个任务。  但是为了解决由于AJAX请求或者定时器等是页面处于一种“假死”状态,影响其他内容的执行,就将所有任务分成两类:同步任务、异步任务。  js引擎是单线程运行的,浏览器无论在什么时候都有且只有一个线程在运行js程序。  在js引擎运行脚本期间,浏览器渲染线程都是处于挂起状态的,也就是被“冻结”了。

    4、同步任务和异步任务

      js的同步任务是在主线程上排队执行的任务,当前一个执行完毕,再执行下一个。

     异步任务,并不进入主线程,而是进入任务队列,当任务队列通知主线某个异步任务可以执行了,且此时主线程忙完了其他任务后,该异步任务才会进入主线成接着执行。

    区分异步和同步:    事件不能立马处理得出相应结果,且有一个回调函数处理返回结果,这就是异步的。

    3,微任务和宏任务?

    macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):Promise,process.nextTick 不同类型的任务会进入不同的Event Queue,有宏任务的队列和微任务的队列。 事件循环的顺序,决定js代码的执行顺序。进入整体代码(宏任务)后,开始第一次循环。接着执行所有的微任务。然后再次从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务。作者:一包链接:https://www.jianshu.com/p/5af66e109eca来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    4,EventLoop

    每办理完一个业务,柜员就会问当前的客户,是否还有其他需要办理的业务。(检查还有没有微任务需要处理)

    而客户明确告知说没有事情以后,柜员就去查看后边还有没有等着办理业务的人。(结束本次宏任务、检查还有没有宏任务需要处理)

    这个检查的过程是持续进行的,每完成一个任务都会进行一次,而这样的操作就被称为Event Loop。(这是个非常简易的描述了,实际上会复杂很多)

    5,手写数组去重的多种方法?

    1,

    2,

    3,

    4,

    6,实现一个clone函数?

    1,

    2,

    3,

    7,浏览器是如何渲染页面的?

    处理HTML标记并构建DOM树

    处理CSS标记并构建CSSOM树

    将DOM与CSSOM合并成一个渲染树

    根据渲染树来布局,计算每个节点的布局信息

    将各个节点绘制到屏幕上

    构建对象模型(DOM,CSSOM)

    浏览器解析HTML文档时,会完成以下步骤:

    读取HTML的原始字节,根据文件制定编码(例:utf-8)解析为各个字符

    将字符串转化为各种标签

    将标签转化为node节点

    DOM构建

    8,call,apply,bind方法得作用分别是什么?

    1.call方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。

    注意:该方法的作用和 apply() 方法类似,只有一个区别,就是call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组。

    2,apply方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。

    注意:call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组。

    3,bind()方法创建一个新的函数,当这个新的函数被调用时,其this置为提供的值,其参数列表前几项,置为创建时指定的参数序列。

    相关文章

      网友评论

          本文标题:第十二天

          本文链接:https://www.haomeiwen.com/subject/nkvvwctx.html