可以达到非阻塞的效果

时间:2021-12-11 08:28:25

==========关于异步===========

什么是回调?

回调是异步编程最根基的要领,好比nodejs中,需要按挨次执行异步逻辑的时候,一般给与后续通报的方法,也就是将后续逻辑封装在回调函数中作为起始函数的参数,逐层去嵌套,操作这种方法来让措施凭据我们所期望的方法走完整个流程。

function learn(something){
    console.log(something)
}
function we(callback,something){
    something += ‘ is cool‘
    callback(something)
}
we(learn,‘Nodejs‘)

也可以使用匿名函数

we(function(something){

console.log(something)

}, ‘Jady‘)

什么是同步,异步?

同步就是执行一个任务,后一个任务期待前一个任务结束然后再执行,措施的执行挨次与任务的摆列挨次一致。好比浏览器真个js是单线程的,js代码只能按挨次执行。

异步每个任务有一个或者多个回调函数,前一个任务执行结束之后不是执行后一个任务,,而是执行回调函数,后一个任务也不是期待前一个任务结束就执行,措施的执行挨次与任务的摆列挨次是不一致的。

var c = 0
function printIt(){
    console.log(c)
}
function plus(callback){
    setTimeout(function(){
        c += 1
        callback(c)
    },1000)
    
}
plus(printIt) 异步执行,会在1000ms后打印1
printIt() 同步执行,会立马打印0

什么是IO?

磁盘的写入和读出,数据的进和出,在nodejs中实际上就是为文件系统,数据库等资源供给接口,向文件系统发送一个请求的时候,不用期待硬盘,硬盘筹备好之后非梗阻接口会通知到node

对付单线程的nodejs来说,我们可以通过回调的方法来进行异步编程,可以到达非梗阻的效果,那么在nodejs里面回调函数又是什么时候被挪用的呢?那就关系到事件和事件驱动。在nodejs中,很多东西都可以触发事件,好比读文件,打开文件,客户端连接到server城市触发事件,所有能够触发事件的东西都是event.EventEmitter的一个实例。我们为每个事件注册了一个回调函数,而这个回调函数不是顿时执行,只有当这个事件产生的时候才会挪用这个回调函数,这种函数执行的方法就叫事件驱动,这种注册回调就是基于事件驱动的回调。如果有大量的异步操纵,好比io的异步操纵,或者计时器控制的延时操纵,他们在完成的时候城市去挪用响应的回调函数,从而完成一些密集的任务而不梗阻整个措施执行的流程,这么多事件就需要事件循环。事件循环是一个回调函数行列队伍,当异步函数执行的时候,回调函数就会被压入这个行列队伍,在nodejs中,靠一个单线程盘问行列队伍中是否有事件,当读取到一个事件的时候,将会挪用跟这个事件关联的javascript函数。

==========关于异步===========

==========关于感化域和上下文==========

感化域和挪用函数,访谒变量的能力有关

感化域分为局部感化域和全局感化域,在局部感化域里可以访谒到全局感化域的变量,但在局部感化域外面就访谒不到局部感化里面所设定的变量

上下文和this关键字有关,是挪用当前可执行代码的引用

this总是指向挪用这个要领的东西

js里的this凡是是当前函数的拥有者

this是js的一个关键字,代表函数运行时自动生成的一个内部东西,只能在函数内部使用

函数上下文执行东西要按照当前的运行环境而定,在全局运行环境中指向全局东西,在函数内部取决于函数被调的方法

被调方法包孕:

1.作为东西的要领

this在var pet = {
    words:‘...‘,
    speak:function(){
        console.log(this.words)
        console.log(this===pet)
    }
}
pet.speak()要领内部,this就指向挪用这个要领的东西

打印功效为:

...

true

2.函数的挪用

this指向执行环境中的全局东西(浏览器->window nodejs->global)

function pet2(words){
    this.words = words
    console.log(this.words)
    console.log(this===global)
}
pet2(‘...‘)

打印功效:

...

true

3.结构函数

this地址的要领被实例东西所挪用,那么this就指向这个实例东西

function pet3(words){
    this.words = words
    this.speak = function(){
        console.log(this.words)
        console.log(this)
    }
}
var cat = new pet3(‘miao‘)

打印功效:

miao
{ words: ‘miao‘, speak: [Function] }

js函数里面有界说时上下文和运行时上下文

变动上下文要领(变动this指向的内容,可便利实现担任)

call(list)

apply(array)