ไธฆ่กๆจกๅๅไบไปถๅพช็ฐ
JavaScript ็ไธฆ่กๆจกๅ๏ผconcurrency model๏ผๆฏๅบๆผใไบไปถๅพช็ฐ๏ผevent loop๏ผใ๏ผๅ ถๅจ้ไฝไธ่ท C ๆๆฏ Java ๆๅพๅคง็ไธๅใ
ๅท่ก็ฐๅขๆฆๅฟต๏ผRuntime concepts๏ผ
ไธ้ข็ๅ งๅฎน่งฃ้ไบไธๅ็่ซๆจกๅ๏ผ็พไปฃ JavaScript ๅผๆๅฏฆไฝไบๅๅพๅคง็จๅบฆๅฐๆไฝณๅไบ่ฉฒๅๆๆ่ฟฐ็่ชๆใ
่ฆ่ฆบๅๅ็พ๏ผVisual representation๏ผ
ๅ ็๏ผStack๏ผ
ๅผๅซๅฝๅผ๏ผFunction๏ผๆๅฝขๆไธๅ frame ็ๅ ็ใ
function foo(b) {
var a = 10;
return a + b + 11;
}
function bar(x) {
var y = 3;
return foo(x * y);
}
console.log(bar(7));
็ถๅผๅซ bar
ๆ๏ผๆ็ข็ไธๅๅซๆ bar
็ๅๆธๅๅๅ่ฎๆธ็ frame๏ผ่ๅจ bar
ๅผๅซไบ foo
ๆ๏ผๅซๆ foo
ๅๆธๅ่ฎๆธ็็ฌฌไบๅ frame ๅฐฑๆ่ขซ็ฝฎๆผๅ ็็ๆไธ้ขใ็ถ foo
ๅๅณๅพ๏ผๆไธ้ข็ frame ๆ่ขซๆฝ้ขๅ ็๏ผๅ
็ไธ bar
็ๅผๅซ frame๏ผใ็ถๅพ็ถ bar ่ฟๅไนๅพ๏ผๅ ็ๅฐฑๆๆธ
็ฉบใ
ๅ ็ฉ๏ผHeap๏ผ
็ฉไปถ่ขซๅ้ ๅจไธๅๅ ็ฉไธญ๏ผไธๅๅช่กจ็คบ่จๆถ้ซไธญ็ไธๅ็ก็ตๆง็ๅคงๅๅใ
ไฝๅ๏ผQueue๏ผ
JavaScript ๅท่ก็ฐๅขๅ ๅซไธๅ่จๆฏไฝๅ๏ผ่ฃก้ขๆฏๅพ ่็็่จๆฏ๏ผๅ ถไธญๆฏๅ่จๆฏ้ฝ่ไธๅ function ็ธ้่ฏใ็ถๅ ็ไธญๆ่ถณๅค ็ฉบ้ๆ๏ผๆๅพ่จๆฏไฝๅๆฟๅไธๅ่จๆฏ้ฒ่ก่็๏ผ่็้็จๅ ๅซไบๅผๅซ็ธ้่ฏ็ functionใๅชๆ็ถๅ ็ๆธ ็ฉบๆ๏ผ่ฉฒ่จๆฏๆ็ฎๆฏๅฎๆ่็ใ
ไบไปถๅพช็ฐ๏ผEvent loop๏ผ
ไนๆไปฅ่ขซ็จฑ็บไบไปถๅพช็ฐ๏ผๆฏๅ ็บ็ถๅธธ่ขซไปฅๅฆไธ็ๆนๅผๅฏฆไฝ๏ผ
while (queue.waitForMessage()) {
queue.processNextMessage();
}
็ถๆฒๆไปปไฝ่จๆฏๆ๏ผqueue.waitForMessage
ๆๅๆญฅๅฐ็ญๅพ
ๆฐ่จๆฏๅฐไพใ
ๅท่กๅฐๅฎๆ๏ผRun-to-completion๏ผ
ๆฏไธๅ่จๆฏ่็ๅฎๆไนๅพๆๆๅท่กไธไธๅใ็ถๅๆไฝ ็็จๅผ็ๆๅ๏ผไธ่ฟฐๆไพไบๅช็ง็็นๆง๏ผๅๆฏ็ถไธๅๅฝๅผ้ๅงๅท่กๆ๏ผไปไธๆ่ขซๅไปฃไธๅ ถไป็จๅผ็ขผๅท่กๅๅ ๅฎๆ๏ผ่ไธๅฏไปฅไฟฎๆน้ๅๅฝๅผๆไฝ็่ณๆ๏ผใ้็นๆง่ C ไธๅ๏ผๅจ C ็ถไธญ๏ผ็ถไธๅๅฝๅผๅจๅท่ก็ทไธญๅท่กๆ๏ผ้จๆๅฏไปฅ่ขซๅ ถไปๅท่ก็ทไธญ็็จๅผ็ขผไธญๆญขใ
้ๆจกๅ็็ผบ้ปๆฏ๏ผ่ฅๆฏไธๅ่จๆฏ่ฆๅท่กๅพไน ๆๅฎๆ๏ผ็ถฒ้ ๆ็จ็จๅผๆ็กๆณๅท่กไธไบไฝฟ็จ่ ็ๅบๆฌๆไฝ๏ผๅฆ้ปๆๆ้ๆๆฏๆฒๅ้ ้ขใ็่ฆฝๅจ็บไบ่ฆ็ทฉ่งฃ้ๅ้ก๏ผๆ่ทณๅบ่ฆ็ชใ่ฉฒๅไฝๅๆๆ้้ไน ๏ผa script taking too long to run๏ผใใ่ฏๅฅฝ็ๅฏฆไฝๆนๅผๆฏ็ธฎ็ญๅท่ก่จๆฏ๏ผ่ฅๅฏ่ฝ็่ฉฑ๏ผๅฐไธๅ่จๆฏๅๆๆธๅ่จๆฏๅท่กใ
ๆทปๅ ่จๆฏ๏ผAdding message๏ผ
็่ฆฝๅจไธญ๏ผๆๆทปๅ ่จๆฏๆฏ็ฑๆผไบไปถ็่งธๅ๏ผไปฅๅไผด้จ่ไบไปถ็็ฃ่ฝ่ ใ่ฅๆฏๆฒๆไบไปถ็ฃ่ฝ่ ๏ผๅ่ฉฒไบไปถ็่งธๅๅฐฑไธๆๅฝขๆ่จๆฏ๏ผไพๅฆ่ชชไธๅ้ปๆ็ๅไฝไผด้จ่้ปๆไบไปถ็ฃ่ฝ่ ๅฐฑๆๅฝขๆไธๅๆฐ็่จๆฏ๏ผๅ ถไป้กไบไปถไบฆ็ถใ
ๅผๅซ setTimeout
ๆๆๅ
ฉๅๅๆธ๏ผ็ฌฌไธๅๆฏๆ่ขซๅ ๅ
ฅๅฐไฝๅไธญ็่จๆฏ๏ผ็ฌฌไบๅๅๆธ็บๅปถ้ฒๆ้๏ผ้ ่จญ็บ0
๏ผใ่ฅ็กๅ
ถไป่จๆฏๅจไฝๅไธญ๏ผๅ้ๅ่จๆฏๆๅจ่จญๅฎ็ๅปถ้ฒๅพ็ซๅป่ขซ่็ใไฝ่ฅไฝๅๅ
งๆๅ
ถไป่จๆฏ๏ผsetTimeout
็่จๆฏๅฟ
้ ็ญๅฐๅ
ถไป่จๆฏ่็ๅฎใๅ ๆญค็ฌฌไบๅๆ้ๅๆธๅช่ฝ่กจ็คบ็บๆๅฐๆ้๏ผ่ไธๆฏไธๅ็ฒพๆบ็ๆ้ใ
้่ฃกๆๅ็คบ็ฏๆญคๆฆๅฟต็ไพๅญ๏ผsetTimeout
ๅจๅ
ถ่จๆๅจๅฐๆๅพไธๆ็ซๅปๅท่ก๏ผ๏ผ
const s = new Date().getSeconds();
setTimeout(function () {
// prints out "2", meaning that the callback is not called immediately after 500 milliseconds.
console.log("Ran after " + (new Date().getSeconds() - s) + " seconds");
}, 500);
while (true) {
if (new Date().getSeconds() - s >= 2) {
console.log("Good, looped for 2 seconds");
break;
}
}
้ถๅปถ้ฒ๏ผZero delay๏ผ
ใ้ถๅปถ้ฒใไธฆ้ๆๅณ่ๅๅผๅฝๅผ๏ผcallback function๏ผๆๅจ 0 ๆฏซ็งไนๅพ็ซๅปๅท่กใ็ถไฝฟ็จๅปถ้ฒ 0 ๆฏซ็งๅๆธไพๅผๅซ setTimeout
ๅฝๅผไธฆ้ๆฏ็จๅผๆ้ไบ่ฉฒๆฎตๆ้ๅฐฑๆๅท่ก๏ผ่ๆฏๆๅ่ไฝๅไธญ็ญๅพ
็่จๆฏๆธ้ใ
ๅจไธ้ข็ฏไพไธญ๏ผใthis is just a messageใๆๅฏซๅจ setTimeout ็ๅๅผ่จๆฏ่ขซๅท่กไนๅ๏ผๅ ็บ่ฉฒๆ้ๆฎตๅๆธๆฏ่ฆๆฑๅท่ก็ฐๅข่็ๆ้็ๆๅฐ็ญๅพ
ๆ้๏ผ่้ไธๅไฟ่ญๆ้ใ
(function () {
console.log("this is the start");
setTimeout(function cb() {
console.log("this is a msg from call back");
});
console.log("this is just a message");
setTimeout(function cb1() {
console.log("this is a msg from call back1");
}, 0);
console.log("this is the end");
})();
// "this is the start"
// "this is just a message"
// "this is the end"
// "this is a msg from call back"
// "this is a msg from call back1"
ๅคๅๅท่ก็ฐๅข็ไบ็ธๆบ้๏ผSeveral Runtime communicating together๏ผ
Web worker ๆๆฏ่ทจไพๆบ็ถฒๅ๏ผcross-origin๏ผ็ iframe
้ฝๆๆๅ่ช็ๅ ็ใๅ ็ฉๅ่จๆฏไฝๅใๅ
ฉๅ็นๅฎ็ๅท่ก็ฐๅขๅช่ฝ้้ postMessage
้ๅๆนๆณไพๆบ้ใๅฆๆไธๅๅท่ก็ฐๅขๆ็ฃ่ฝ message
ไบไปถๆ๏ผๅฆไธๅๅท่ก็ฐๅขไพฟๅฏ้้้ๅๆนๆณไพๆฐๅขไธๅ่จๆฏๅฐ่ฉฒๅท่ก็ฐๅขไธญใ
็ตไธ้ปๅก๏ผNever blocking๏ผ
ไบไปถๅพช็ฐ้ๅๆจกๅๆไธๅ้ๅธธๆ่ถฃ็็น่ฒๅฐฑๆฏๆฐธไธ้ปๅก๏ผ้่ๅ ถไป่ช่จไธไธๆจฃใI/O ็่็้ๅธธๆ็ถ็ฑไบไปถไปฅๅๅๅผๅฝๅผๅฏฆไฝ๏ผๅ ๆญค็ถไธๅ็จๅผๆญฃๅจ็ญๅพ IndexedDB ็ๆฅ่ฉข็ตๆๆๆฏๅๅณ XHR ่ซๆฑๆ๏ผไพ่ๅฏไปฅๅท่กๅ ถไปๅๆฏไฝฟ็จ่ ่ผธๅ ฅ็ๅไฝใ
ไพๅค๏ผexceptions๏ผๆฐธ้ ๅญๅจ๏ผๅๆฏ alert
ๆๆฏๅๆญฅ็ XHR๏ผไฝๅฅฝ็ๅฏฆไฝๆนๅผๅฐฑๆฏ้ฟ้ไปๅใๅฆๅค่ฆๆณจๆๅๆฏ๏ผไพๅค็ไพๅคไธ็ดๆฏๅญๅจ็๏ผไฝ้ๅธธ็บๅฏฆไฝๆ็้ฏ่ชค่้ๅ
ถไปๆ
ๆณ๏ผใ