** (callback) 是作為引數傳遞給另乙個函式的函式。這種技術允許函式呼叫另乙個函式。
**函式可以在另乙個函式完成後執行。
j**ascript 函式按照它們被呼叫的順序執行。而不是以它們被定義的順序。
// txt = "goodbye"
let txt;
function mydisplayer(some)
function myfirst()
function mysecond()
myfirst();
mysecond();
// 假設您要進行計算,然後賦值。
let txt;
function mydisplayer(some)
function mycalculator(num1, num2)
let result = mycalculator(5, 5);
mydisplayer(result);
// 或者,可以呼叫 mycalculator,並讓 mycalculator 函式呼叫 mydisplayer
let txt;
function mydisplayer(some)
function mycalculator(num1, num2)
mycalculator(5, 5);
**是作為引數傳遞給另乙個函式的函式。
// 使用**,可以通過**呼叫 mydisplayer,並在計算完成後讓 mycalculator 執行**
let txt;
function mydisplayer(some)
function mycalculator(num1, num2, mycallback)
mycalculator(5, 5, mydisplayer);
與其他函式並行執行的函式稱為非同步(asynchronous)。j**ascript 中有很多關於非同步函式的例子,在這裡只列舉了 settimeout() 和 setinterval()**最常與非同步函式一起使用。
在使用 j**ascript 函式 settimeout() 時,可以指定超時時執行的**函式
// myfunction 被用作**。函式(函式名)作為引數傳遞給 settimeout()。
// 3000 是超時前的毫秒數,所以 3 秒後會呼叫 myfunction()。
let txt;
settimeout(myfunction, 3000);
function myfunction()
注意:將函式作為引數傳遞時,請記住不要使用括號。
// 若不將函式的名稱作為引數傳遞給另乙個函式,始終可以傳遞整個函式
// function() 用作**。它是乙個完整的函式。完整的函式作為引數被傳遞給 settimeout()。
// 3000 是超時前的毫秒數,所以 3 秒後會呼叫 myfunction()。
let txt;
settimeout(function() , 3000);
function myfunction(value)
在使用 j**ascript 函式 setinterval() 時,可以指定每個間隔執行的**函式
// 1000 是間隔之間的毫秒數,因此 myfunction() 將每秒呼叫一次
let count = 0;
setinterval(myfunction, 1000);
function myfunction()
j**ascript promise 物件包含生產**和對消費**的呼叫
let mypromise = new promise(function(myresolve, myreject) );
// "consuming code" (必須等待乙個兌現的承諾)
mypromise.then(
function(value) ,
function(error)
);
當執行**獲得結果時,它應該呼叫兩個**之一:
結果呼叫
成功myresolve(result value)
出錯myreject(error object)
j**ascript promise 物件可以是:
當 promise 物件 "pending"(工作)時,結果是 undefined。
當 promise 物件 "fulfilled" 時,結果是乙個值。
當 promise 物件 "rejected" 時,結果是乙個錯誤物件。
mypromise.state
mypromise.result
"pending"
undefined
"fulfilled"
結果值"rejected"
error 物件
注意:無法訪問 promise 屬性 state 和 result。必須使用 promise 方法來處理 promise。
// promise.then() 有兩個引數,乙個是成功時的**,另乙個是失敗時的**。
// 兩者都是可選的,因此您可以為成功或失敗新增**。
mypromise.then(
function(value) ,
function(error)
);// mypromise 判斷後把 myresolve() 作為**函式,然後執行 function(value)
// txt ="ok"
let txt;
function mydisplayer(some)
let mypromise = new promise(function(myresolve, myreject) else
});mypromise.then(
function(value) ,
function(error)
);
// settimeout() 使用 promise 的例子
let txt;
let mypromise = new promise(function(myresolve, myreject) , 3000);
});mypromise.then(function(value) );
函式前的關鍵字 async 使函式返回 promise
async function myfunction()
myfunction().then(
function(value) ,
function(error)
);// 或者更簡單,因為期望正常值(正常響應,而不是錯誤)
async function myfunction()
myfunction().then(
function(value)
);
函式前的關鍵字 await 使函式等待 promise注意:await 關鍵字只能在 async 函式中使用。
// txt = "i love you !!"
let txt;
async function mydisplay() );
txt = await mypromise;
}mydisplay();
// settimeout() 使用 async/await 的例子
// 3 秒後 txt = "i love you !!"
let txt;
async function mydisplay() , 3000);
});txt = await mypromise;
}mydisplay();
JS非同步機制
js非同步機制 主線程不斷讀取執行棧中的同步事件,直到執行棧空 非同步任務結束放入任務佇列,執行棧空時主線程讀取任務佇列 任務佇列讀取完畢,回到步驟1 巨集任務與微任務 巨集任務 script 整體 settimeout setinterval ui 渲染 i o postmessage messa...
JS 非同步載入
參考學習 有關promise的學習 如果 async async 指令碼相對於頁面的其餘部分非同步地執行 當頁面繼續進行解析時,指令碼將被執行 如果不使用 async 且defer defer 指令碼將在頁面完成解析時執行 如果既不使用 async 也不使用 defer 在瀏覽器繼續解析頁面之前,立...
js的非同步載入
今天被問到了如何非同步載入js,聽到這句話我內心是拒絕的,啥玩意兒?js也要用非同步載入不是引入了就行了,也沒見速度變慢啊。後來仔細查詢了一下,才發現自己原來還是太年輕了。因為之前自己寫的載入的都是本地js,或者是並沒有複雜邏輯運算的js,導致看不出來太大問題,查完資料後,要將不會的記在這裡,當作學...