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 è¿åä¹å¾ï¼å çå°±ææ¸
空ã
ç©ä»¶è¢«åé å¨ä¸åå ç©ä¸ï¼ä¸ååªè¡¨ç¤ºè¨æ¶é«ä¸çä¸åç¡çµæ§ç大ååã
ä½åï¼Queueï¼JavaScript å·è¡ç°å¢å å«ä¸åè¨æ¯ä½åï¼è£¡é¢æ¯å¾ èççè¨æ¯ï¼å ¶ä¸æ¯åè¨æ¯é½èä¸å function ç¸éè¯ãç¶å çä¸æè¶³å¤ ç©ºéæï¼æå¾è¨æ¯ä½åæ¿åä¸åè¨æ¯é²è¡èçï¼èçéç¨å å«äºå¼å«ç¸éè¯ç functionãåªæç¶å çæ¸ 空æï¼è©²è¨æ¯æç®æ¯å®æèçã
äºä»¶å¾ªç°ï¼Event loopï¼ä¹æä»¥è¢«ç¨±çºäºä»¶å¾ªç°ï¼æ¯å çºç¶å¸¸è¢«ä»¥å¦ä¸çæ¹å¼å¯¦ä½ï¼
while (queue.waitForMessage()) {
queue.processNextMessage();
}
ç¶æ²æä»»ä½è¨æ¯æï¼queue.waitForMessage
æåæ¥å°çå¾
æ°è¨æ¯å°ä¾ã
æ¯ä¸åè¨æ¯èç宿ä¹å¾ææå·è¡ä¸ä¸åãç¶åæä½ çç¨å¼çæåï¼ä¸è¿°æä¾äºåªç§çç¹æ§ï¼åæ¯ç¶ä¸åå½å¼éå§å·è¡æï¼ä»ä¸æè¢«å代ä¸å ¶ä»ç¨å¼ç¢¼å·è¡åå 宿ï¼èä¸å¯ä»¥ä¿®æ¹éåå½å¼æä½çè³æï¼ãéç¹æ§è 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
äºä»¶æï¼å¦ä¸åå·è¡ç°å¢ä¾¿å¯éééåæ¹æ³ä¾æ°å¢ä¸åè¨æ¯å°è©²å·è¡ç°å¢ä¸ã
äºä»¶å¾ªç°é忍¡åæä¸åé常æè¶£çç¹è²å°±æ¯æ°¸ä¸é»å¡ï¼éèå ¶ä»èªè¨ä¸ä¸æ¨£ãI/O çèçé常æç¶ç±äºä»¶ä»¥ååå¼å½å¼å¯¦ä½ï¼å æ¤ç¶ä¸åç¨å¼æ£å¨çå¾ IndexedDB çæ¥è©¢çµæææ¯åå³ XHR è«æ±æï¼ä¾èå¯ä»¥å·è¡å ¶ä»åæ¯ä½¿ç¨è è¼¸å ¥çåä½ã
ä¾å¤ï¼exceptionsï¼æ°¸é åå¨ï¼åæ¯ alert
ææ¯åæ¥ç XHRï¼ä½å¥½ç坦使¹å¼å°±æ¯é¿éä»åãå¦å¤è¦æ³¨æåæ¯ï¼ä¾å¤çä¾å¤ä¸ç´æ¯åå¨çï¼ä½é常çºå¯¦ä½æçé¯èª¤èéå
¶ä»æ
æ³ï¼ã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4