Node.js 入门教程 (三):API-准备知识
2021-04-24 00:54
标签:oba global on() javascrip 事件 java 客户端 延时 list ==========关于异步=========== 什么是回调? 回调是异步编程最基本的方法,比如nodejs中,需要按顺序执行异步逻辑的时候,一般采用后续传递的方式,也就是将后续逻辑封装在回调函数中作为起始函数的参数,逐层去嵌套,利用这种方式来让程序按照我们所期望的方式走完整个流程。 function learn(something){ 也可以使用匿名函数 we(function(something){ console.log(something) }, ‘Jady‘) 什么是同步,异步? 同步就是执行一个任务,后一个任务等待前一个任务结束然后再执行,程序的执行顺序与任务的排列顺序一致。比如浏览器端的js是单线程的,js代码只能按顺序执行。 异步每个任务有一个或者多个回调函数,前一个任务执行结束之后不是执行后一个任务,而是执行回调函数,后一个任务也不是等待前一个任务结束就执行,程序的执行顺序与任务的排列顺序是不一致的。 var c = 0 什么是IO? 磁盘的写入和读出,数据的进和出,在nodejs中实际上就是为文件系统,数据库等资源提供接口,向文件系统发送一个请求的时候,不用等待硬盘,硬盘准备好之后非阻塞接口会通知到node 对于单线程的nodejs来说,我们可以通过回调的方式来进行异步编程,可以达到非阻塞的效果,那么在nodejs里面回调函数又是什么时候被调用的呢?那就关系到事件和事件驱动。在nodejs中,很多对象都可以触发事件,比如读文件,打开文件,客户端连接到server都会触发事件,所有能够触发事件的对象都是event.EventEmitter的一个实例。我们为每个事件注册了一个回调函数,而这个回调函数不是马上执行,只有当这个事件发生的时候才会调用这个回调函数,这种函数执行的方式就叫事件驱动,这种注册回调就是基于事件驱动的回调。如果有大量的异步操作,比如io的异步操作,或者计时器控制的延时操作,他们在完成的时候都会去调用响应的回调函数,从而完成一些密集的任务而不阻塞整个程序执行的流程,这么多事件就需要事件循环。事件循环是一个回调函数队列,当异步函数执行的时候,回调函数就会被压入这个队列,在nodejs中,靠一个单线程查询队列中是否有事件,当读取到一个事件的时候,将会调用跟这个事件关联的javascript函数。 ==========关于异步=========== ==========关于作用域和上下文========== 作用域和调用函数,访问变量的能力有关 作用域分为局部作用域和全局作用域,在局部作用域里可以访问到全局作用域的变量,但在局部作用域外面就访问不到局部作用里面所设定的变量 上下文和this关键字有关,是调用当前可执行代码的引用 this总是指向调用这个方法的对象 js里的this通常是当前函数的拥有者 this是js的一个关键字,代表函数运行时自动生成的一个内部对象,只能在函数内部使用 函数上下文执行对象要根据当前的运行环境而定,在全局运行环境中指向全局对象,在函数内部取决于函数被调的方式 被调方式包括: 1.作为对象的方法 this在var pet = { 打印结果为: ... true 2.函数的调用 this指向执行环境中的全局对象(浏览器->window nodejs->global) function pet2(words){ 打印结果: ... true 3.构造函数 this所在的方法被实例对象所调用,那么this就指向这个实例对象
function pet3(words){ 打印结果: miao js函数里面有定义时上下文和运行时上下文 更改上下文方法(更改this指向的内容,可方便实现继承) call(list) apply(array) var pet = { pet.speak.call(dog,‘speak‘) 运行结果: speak wang function Pet(words){ dog.speak() 运行结果: wang ==========关于作用域和上下文========== Node.js 入门教程 (三):API-准备知识 标签:oba global on() javascrip 事件 java 客户端 延时 list 原文地址:http://www.cnblogs.com/lixiaomei-blog/p/7990067.html
console.log(something)
}
function we(callback,something){
something += ‘ is cool‘
callback(something)
}
we(learn,‘Nodejs‘)
function printIt(){
console.log(c)
}
function plus(callback){
setTimeout(function(){
c += 1
callback(c)
},1000)
}
plus(printIt) 异步执行,会在1000ms后打印1
printIt() 同步执行,会立马打印0
words:‘...‘,
speak:function(){
console.log(this.words)
console.log(this===pet)
}
}
pet.speak()方法内部,this就指向调用这个方法的对象
this.words = words
console.log(this.words)
console.log(this===global)
}
pet2(‘...‘)
this.words = words
this.speak = function(){
console.log(this.words)
console.log(this)
}
}
var cat = new pet3(‘miao‘)
{ words: ‘miao‘, speak: [Function] }
words:‘...‘,
speak:function(say){
console.log(say+‘ ‘+this.words)
}
}
var dog = {
words:‘wang‘
}
this.words = words
this.speak = function(){
console.log(this.words)
}
}
function Dog(words){
Pet.call(this,words)
}
var dog = new Dog(‘wang‘)
文章标题:Node.js 入门教程 (三):API-准备知识
文章链接:http://soscw.com/index.php/essay/78709.html