Knuth-Shuffle前端varletconst分别是什么ES6中新增let命令,用来声明变量。它的用法类似于var,但是不存在变量提升,且只在let命令所在的代码块内有效,const是用了声明只读常量的,一旦声明,常量的值就不能修改。let和const命令都不允许重复声明同一个变量。而var是允许重复声明的,但重复声明显然是不建议的。相关链接:浅谈var、let和const的区别Vue的生命周期Vue实例有一个完整的生命周期,生命周期也就是指一个实例从开始创建到销毁的这个过程
beforeCreate()在实例创建之间执行,数据未加载状态
created()在实例创建、数据加载后,能初始化数据,dom渲染之前执行
beforeMount()虚拟dom已创建完成,在数据渲染前最后一次更改数据
mounted()页面、数据渲染完成,真实dom挂载完成
beforeUpdate()重新渲染之前触发
updated()数据已经更改完成,dom也重新render完成,更改数据会陷入死循环
beforeDestory()和destoryed()前者是销毁前执行(实例仍然完全可用),后者则是销毁后执行
相关链接:Vue出场率99%的面试题跨域问题如何解决前端调用的后端接口不属于同一个域(域名或端口不同),就会产生跨域问题,也就是说你的应用访问了该应用域名或端口之外的域名或端口。解决跨域问题的三种思路JSONPJSONP是JSONwithPadding的缩写。script标签的跨域是不受同源策略限制的。那么我们向后端请求一个js文件,在这个js文件当中,返回一个函数的执行,而我们想要得到的数据,是这个函数的参数。CORSCORS是Cross-OriginResourceSharing的缩写。CORS新增了一组HTTP首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。服务器返回的responseheader中,会有一个Access-Control-Allow-Origin字段,里面写明允许那些“源”,浏览器发现两者一致,或者服务器允许所有的“源”,那么跨域成功!反向代理跨域只是浏览器向服务器发送请求的时候,浏览器的限制。而服务器和服务器之间是没有跨域的限制的。反向代理是利用代理服务器接收到请求之后,转发给真正的服务器,并把结果返回到浏览器上。相关链接:前端面试题——跨域什么叫闭包小"*"书(你不知道的JavaScript):当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。红宝书(JavaScript高级程序设计):闭包是指有权访问另一个函数作用域中的变量的函数。varlocal="变量"functionfoo(){console.log(local)}三行代码中,有一个局部变量local,有一个函数foo,foo里面可以访问到local变量。好了这就是一个闭包:「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。相关链接:「每日一题」JS中的闭包是什么?GoGo和PHP有哪些区别Go是由Google设计的一门静态类型的编译型语言。PHP是一种动态类型语言。数据类型Go同时支持有符号和无符号整数,而PHP只支持有符号整数。另一个主要区别是数组。Go对array和map有单独的类型,而PHP数组实际上是有序的map。Go与PHP相比没有对象。但是,Go有一个类似于object的struct类型。函数Go函数可以返回任意数量的结果,而PHP函数只能返回一个结果。但是,PHP可以通过返回数组来模拟相同的功能。相关链接:Go与PHP的语法对比Go中的协程之间怎么通信不要通过共享内存来通信,而应该通过通信来共享内存。Go中的协程一般都是通过Channel来进行通信。Go语言中,要传递某个数据给另一个goroutine(协程),可以把这个数据封装成一个对象,然后把这个对象的指针传入某个channel中,另外一个goroutine从这个channel中读出这个指针,并处理其指向的内存对象。Go从语言层面保证同一个时间只有一个goroutine能够访问channel里面的数据,为开发者提供了一种优雅简单的工具,所以Go的做法就是使用channel来通信,通过通信来传递内存数据,使得内存数据在不同的goroutine中传递,而不是使用共享内存来通信。相关链接:GO语言基础进阶教程:channel通道Go的协程调度模型Go的协程调度模型即GPM调度模型。G:Goroutine,每个Goroutine对应一个G结构体,G存储Goroutine的运行堆栈、状态以及任务函数,可重用。G并非执行体,每个G需要绑定到P才能被调度执行。P:Processor,表示逻辑处理器,对G来说,P相当于CPU核,G只有绑定到P才能被调度。对M来说,P提供了相关的执行环境(Context),如内存分配状态(mcache),任务队列(G)等。P的数量决定了系统内最大可并行的G的数量(前提:物理CPU核数=P的数量)。P的数量由用户设置的GoMAXPROCS决定,但是不论GoMAXPROCS设置为多大,P的数量最大为。M:Machine,OS内核线程抽象,代表着真正执行计算的资源,在绑定有效的P后,进入schedule循环;而schedule循环的机制大致是从Global队列、P的Local队列以及wait队列中获取。M的数量是不定的,由GoRuntime调整,为了防止创建过多OS线程导致系统调度不过来,目前默认最大限制为个。M并不保留G状态,这是G可以跨M调度的基础。具体流程如下
我们通过gofunc()来创建一个goroutine。
有两个存储G的队列,一个是局部调度器P的本地队列、一个是全局G队列。新创建的G会先保存在P的本地队列中,如果P的本地队列已经满了就会保存在全局的队列中。
G只能运行在M中,一个M必须持有一个P,M与P是1:1的关系。M会从P的本地队列弹出一个可执行状态的G来执行,如果P的本地队列为空,就会想其他的MP组合偷取一个可执行的G来执行。
一个M调度G执行的过程是一个循环机制。
当M执行某一个G时候如果发生了syscall或则其余阻塞操作,M会阻塞,如果当前有一些G在执行,runtime会把这个线程M从P中摘除(detach),然后再创建一个新的操作系统的线程(如果有空闲的线程可用就复用空闲线程)来服务于这个P。
当M系统调用结束时候,这个G会尝试获取一个空闲的P执行,并放入到这个P的本地队列。如果获取不到P,那么这个线程M变成休眠状态,加入到空闲线程中,然后这个G会被放入全局队列中。
相关链接:全文图解Golang调度器GMP原理与调度-----End-----更多好文请扫描下面