Node.js 入门教程 (三):API-准备知识
==========關(guān)于異步===========
什么是回調(diào)?
回調(diào)是異步編程最基本的方法,比如nodejs中,需要按順序執(zhí)行異步邏輯的時(shí)候,一般采用后續(xù)傳遞的方式,也就是將后續(xù)邏輯封裝在回調(diào)函數(shù)中作為起始函數(shù)的參數(shù),逐層去嵌套,利用這種方式來讓程序按照我們所期望的方式走完整個(gè)流程。
function learn(something){
?? ?console.log(something)
}
function we(callback,something){
?? ?something += ' is cool'
?? ?callback(something)
}
we(learn,'Nodejs')
也可以使用匿名函數(shù)
we(function(something){
console.log(something)
}, 'Jady')
?
什么是同步,異步?
同步就是執(zhí)行一個(gè)任務(wù),后一個(gè)任務(wù)等待前一個(gè)任務(wù)結(jié)束然后再執(zhí)行,程序的執(zhí)行順序與任務(wù)的排列順序一致。比如瀏覽器端的js是單線程的,js代碼只能按順序執(zhí)行。
異步每個(gè)任務(wù)有一個(gè)或者多個(gè)回調(diào)函數(shù),前一個(gè)任務(wù)執(zhí)行結(jié)束之后不是執(zhí)行后一個(gè)任務(wù),而是執(zhí)行回調(diào)函數(shù),后一個(gè)任務(wù)也不是等待前一個(gè)任務(wù)結(jié)束就執(zhí)行,程序的執(zhí)行順序與任務(wù)的排列順序是不一致的。
var c = 0
function printIt(){
?? ?console.log(c)
}
function plus(callback){
?? ?setTimeout(function(){
?? ??? ?c += 1
?? ??? ?callback(c)
?? ?},1000)
?? ?
}
plus(printIt) 異步執(zhí)行,會(huì)在1000ms后打印1
printIt() 同步執(zhí)行,會(huì)立馬打印0
?
什么是IO?
磁盤的寫入和讀出,數(shù)據(jù)的進(jìn)和出,在nodejs中實(shí)際上就是為文件系統(tǒng),數(shù)據(jù)庫等資源提供接口,向文件系統(tǒng)發(fā)送一個(gè)請(qǐng)求的時(shí)候,不用等待硬盤,硬盤準(zhǔn)備好之后非阻塞接口會(huì)通知到node
?
?對(duì)于單線程的nodejs來說,我們可以通過回調(diào)的方式來進(jìn)行異步編程,可以達(dá)到非阻塞的效果,那么在nodejs里面回調(diào)函數(shù)又是什么時(shí)候被調(diào)用的呢?那就關(guān)系到事件和事件驅(qū)動(dòng)。在nodejs中,很多對(duì)象都可以觸發(fā)事件,比如讀文件,打開文件,客戶端連接到server都會(huì)觸發(fā)事件,所有能夠觸發(fā)事件的對(duì)象都是event.EventEmitter的一個(gè)實(shí)例。我們?yōu)槊總€(gè)事件注冊(cè)了一個(gè)回調(diào)函數(shù),而這個(gè)回調(diào)函數(shù)不是馬上執(zhí)行,只有當(dāng)這個(gè)事件發(fā)生的時(shí)候才會(huì)調(diào)用這個(gè)回調(diào)函數(shù),這種函數(shù)執(zhí)行的方式就叫事件驅(qū)動(dòng),這種注冊(cè)回調(diào)就是基于事件驅(qū)動(dòng)的回調(diào)。如果有大量的異步操作,比如io的異步操作,或者計(jì)時(shí)器控制的延時(shí)操作,他們?cè)谕瓿傻臅r(shí)候都會(huì)去調(diào)用響應(yīng)的回調(diào)函數(shù),從而完成一些密集的任務(wù)而不阻塞整個(gè)程序執(zhí)行的流程,這么多事件就需要事件循環(huán)。事件循環(huán)是一個(gè)回調(diào)函數(shù)隊(duì)列,當(dāng)異步函數(shù)執(zhí)行的時(shí)候,回調(diào)函數(shù)就會(huì)被壓入這個(gè)隊(duì)列,在nodejs中,靠一個(gè)單線程查詢隊(duì)列中是否有事件,當(dāng)讀取到一個(gè)事件的時(shí)候,將會(huì)調(diào)用跟這個(gè)事件關(guān)聯(lián)的javascript函數(shù)。
==========關(guān)于異步===========
==========關(guān)于作用域和上下文==========
作用域和調(diào)用函數(shù),訪問變量的能力有關(guān)
作用域分為局部作用域和全局作用域,在局部作用域里可以訪問到全局作用域的變量,但在局部作用域外面就訪問不到局部作用里面所設(shè)定的變量
?
上下文和this關(guān)鍵字有關(guān),是調(diào)用當(dāng)前可執(zhí)行代碼的引用
this總是指向調(diào)用這個(gè)方法的對(duì)象
js里的this通常是當(dāng)前函數(shù)的擁有者
this是js的一個(gè)關(guān)鍵字,代表函數(shù)運(yùn)行時(shí)自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用
函數(shù)上下文執(zhí)行對(duì)象要根據(jù)當(dāng)前的運(yùn)行環(huán)境而定,在全局運(yùn)行環(huán)境中指向全局對(duì)象,在函數(shù)內(nèi)部取決于函數(shù)被調(diào)的方式
被調(diào)方式包括:
1.作為對(duì)象的方法
this在var pet = {
?? ?words:'...',
?? ?speak:function(){
?? ??? ?console.log(this.words)
?? ??? ?console.log(this===pet)
?? ?}
}
pet.speak()方法內(nèi)部,this就指向調(diào)用這個(gè)方法的對(duì)象
打印結(jié)果為:
...
true
?
2.函數(shù)的調(diào)用
this指向執(zhí)行環(huán)境中的全局對(duì)象(瀏覽器->window nodejs->global)
function pet2(words){
?? ?this.words = words
?? ?console.log(this.words)
?? ?console.log(this===global)
}
pet2('...')
打印結(jié)果:
...
true
?
3.構(gòu)造函數(shù)
this所在的方法被實(shí)例對(duì)象所調(diào)用,那么this就指向這個(gè)實(shí)例對(duì)象
function pet3(words){
?? ?this.words = words
?? ?this.speak = function(){
?? ??? ?console.log(this.words)
?? ??? ?console.log(this)
?? ?}
}
var cat = new pet3('miao')
打印結(jié)果:
miao
{ words: 'miao', speak: [Function] }
?
js函數(shù)里面有定義時(shí)上下文和運(yùn)行時(shí)上下文
更改上下文方法(更改this指向的內(nèi)容,可方便實(shí)現(xiàn)繼承)
call(list)
apply(array)
var pet = {
?? ?words:'...',
?? ?speak:function(say){
?? ??? ?console.log(say+' '+this.words)
?? ?}
}
var dog = {
?? ?words:'wang'
}
pet.speak.call(dog,'speak')
運(yùn)行結(jié)果:
speak wang
?
function Pet(words){
?? ?this.words = words
?? ?this.speak = function(){
?? ??? ?console.log(this.words)
?? ?}
}
function Dog(words){
?? ?Pet.call(this,words)
}
var dog = new Dog('wang')
dog.speak()
運(yùn)行結(jié)果:
wang
==========關(guān)于作用域和上下文==========
轉(zhuǎn)載于:https://www.cnblogs.com/lixiaomei-blog/p/7990067.html
總結(jié)
以上是生活随笔為你收集整理的Node.js 入门教程 (三):API-准备知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 874. 模拟行走机器人
- 下一篇: 映射:map