Node.js 入门教程 (三):API-准备知识
==========關于異步===========
什么是回調?
回調是異步編程最基本的方法,比如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)
var pet = {
?? ?words:'...',
?? ?speak:function(say){
?? ??? ?console.log(say+' '+this.words)
?? ?}
}
var dog = {
?? ?words:'wang'
}
pet.speak.call(dog,'speak')
運行結果:
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()
運行結果:
wang
==========關于作用域和上下文==========
轉載于:https://www.cnblogs.com/lixiaomei-blog/p/7990067.html
總結
以上是生活随笔為你收集整理的Node.js 入门教程 (三):API-准备知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 874. 模拟行走机器人
- 下一篇: 映射:map