日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Node.js 入门教程 (三):API-准备知识

發(fā)布時(shí)間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Node.js 入门教程 (三):API-准备知识 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

==========關(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。