ä¸ãä»ä¹æ¯éå
ï¼
âå®æ¹âç解éæ¯ï¼æè°âéå
âï¼æçæ¯ä¸ä¸ªæ¥æ许å¤åéåç»å®äºè¿äºåéçç¯å¢ç表达å¼ï¼é常æ¯ä¸ä¸ªå½æ°ï¼ï¼å èè¿äºåéä¹æ¯è¯¥è¡¨è¾¾å¼çä¸é¨åã
ç¸ä¿¡å¾å°æ人è½ç´æ¥çæè¿å¥è¯ï¼å 为ä»æè¿°ç太å¦æ¯ãææ³ç¨å¦ä½å¨Javascriptä¸å建ä¸ä¸ªéå
æ¥åè¯ä½ ä»ä¹æ¯éå
ï¼å 为跳è¿éå
çå建è¿ç¨ç´æ¥ç解éå
çå®ä¹æ¯é常å°é¾çãçä¸é¢è¿æ®µä»£ç ï¼
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
è¿æ®µä»£ç æ两个ç¹ç¹ï¼
1ãå½æ°båµå¥å¨å½æ°aå
é¨ï¼
2ãå½æ°aè¿åå½æ°bã
è¿æ ·å¨æ§è¡å®var c=a()åï¼åécå®é
ä¸æ¯æåäºå½æ°bï¼åæ§è¡c()åå°±ä¼å¼¹åºä¸ä¸ªçªå£æ¾ç¤ºiçå¼(第ä¸æ¬¡ä¸º1)ãè¿æ®µä»£ç å
¶å®å°±å建äºä¸ä¸ªéå
ï¼ä¸ºä»ä¹ï¼å 为å½æ°aå¤çåécå¼ç¨äºå½æ°aå
çå½æ°bï¼å°±æ¯è¯´ï¼
å½å½æ°açå
é¨å½æ°b被å½æ°aå¤çä¸ä¸ªåéå¼ç¨çæ¶åï¼å°±å建äºä¸ä¸ªéå
ã
æçæ³ä½ ä¸å®è¿æ¯ä¸ç解éå
ï¼å ä¸ºä½ ä¸ç¥ééå
æä»ä¹ä½ç¨ï¼ä¸é¢è®©æ们继ç»æ¢ç´¢ã
äºãéå
æä»ä¹ä½ç¨ï¼
ç®èè¨ä¹ï¼éå
çä½ç¨å°±æ¯å¨aæ§è¡å®å¹¶è¿ååï¼éå
使å¾Javascriptçåå¾åæ¶æºå¶GCä¸ä¼æ¶åaæå ç¨çèµæºï¼å 为açå
é¨å½æ°bçæ§è¡éè¦ä¾èµaä¸çåéãè¿æ¯å¯¹éå
ä½ç¨çé常ç´ç½çæè¿°ï¼ä¸ä¸ä¸ä¹ä¸ä¸¥è°¨ï¼ä½å¤§æ¦ææå°±æ¯è¿æ ·ï¼ç解éå
éè¦å¾ªåºæ¸è¿çè¿ç¨ã
å¨ä¸é¢çä¾åä¸ï¼ç±äºéå
çåå¨ä½¿å¾å½æ°aè¿ååï¼aä¸çiå§ç»åå¨ï¼è¿æ ·æ¯æ¬¡æ§è¡c()ï¼ié½æ¯èªå 1åalertåºiçå¼ã
é£ ä¹æ们æ¥æ³è±¡å¦ä¸ç§æ
åµï¼å¦æaè¿åçä¸æ¯å½æ°bï¼æ
åµå°±å®å
¨ä¸åäºãå 为aæ§è¡å®åï¼b没æ被è¿åç»açå¤çï¼åªæ¯è¢«aæå¼ç¨ï¼èæ¤æ¶aä¹åªä¼è¢«bå¼ ç¨ï¼å æ¤å½æ°aåbäºç¸å¼ç¨ä½åä¸è¢«å¤çææ°(被å¤çå¼ç¨)ï¼å½æ°aåbå°±ä¼è¢«GCåæ¶ã(å
³äºJavascriptçåå¾åæ¶æºå¶å°å¨åé¢è¯¦ç»ä»ç»)
ä¸ãéå
å
çå¾®è§ä¸ç
å¦ æè¦æ´å æ·±å
¥çäºè§£éå
以åå½æ°aååµå¥å½æ°bçå
³ç³»ï¼æ们éè¦å¼å
¥å¦å¤å 个æ¦å¿µï¼å½æ°çæ§è¡ç¯å¢(excution context)ãæ´»å¨å¯¹è±¡(call object)ãä½ç¨å(scope)ãä½ç¨åé¾(scope chain)ã以å½æ°aä»å®ä¹å°æ§è¡çè¿ç¨ä¸ºä¾éè¿°è¿å 个æ¦å¿µã
1ãå½å®ä¹å½æ°açæ¶åï¼js解éå¨ä¼å°å½æ°açä½ç¨åé¾(scope chain)设置为å®ä¹aæ¶aæå¨çâç¯å¢âï¼å¦æaæ¯ä¸ä¸ªå
¨å±å½æ°ï¼åscope chainä¸åªæwindow对象ã
2ãå½å½æ°aæ§è¡çæ¶åï¼aä¼è¿å
¥ç¸åºçæ§è¡ç¯å¢(excution context)ã
3ãå¨å建æ§è¡ç¯å¢çè¿ç¨ä¸ï¼é¦å
ä¼ä¸ºaæ·»å ä¸ä¸ªscopeå±æ§ï¼å³açä½ç¨åï¼å
¶å¼å°±ä¸ºç¬¬1æ¥ä¸çscope chainãå³a.scope=açä½ç¨åé¾ã
4ãç¶åæ§è¡ç¯å¢ä¼å建ä¸ä¸ªæ´»å¨å¯¹è±¡(call object)ãæ´»å¨å¯¹è±¡ä¹æ¯ä¸ä¸ªæ¥æå±æ§ç对象ï¼ä½å®ä¸å
·æååèä¸ä¸è½éè¿JavaScript代ç ç´æ¥è®¿é®ãå建å®æ´»å¨å¯¹è±¡åï¼ææ´»å¨å¯¹è±¡æ·»å å°açä½ç¨åé¾çæ顶端ãæ¤æ¶açä½ç¨åé¾å
å«äºä¸¤ä¸ªå¯¹è±¡ï¼açæ´»å¨å¯¹è±¡åwindow对象ã
5ãä¸ä¸æ¥æ¯å¨æ´»å¨å¯¹è±¡ä¸æ·»å ä¸ä¸ªargumentså±æ§ï¼å®ä¿åçè°ç¨å½æ°aæ¶æä¼ éçåæ°ã
6ãæåæææå½æ°açå½¢ååå
é¨çå½æ°bçå¼ç¨ä¹æ·»å å°açæ´»å¨å¯¹è±¡ä¸ãå¨è¿ä¸æ¥ä¸ï¼å®æäºå½æ°bççå®ä¹ï¼å æ¤å¦å第3æ¥ï¼å½æ°bçä½ç¨åé¾è¢«è®¾ç½®ä¸ºbæ被å®ä¹çç¯å¢ï¼å³açä½ç¨åã
å°æ¤ï¼æ´ä¸ªå½æ°aä»å®ä¹å°æ§è¡çæ¥éª¤å°±å®æäºãæ¤æ¶aè¿åå½æ°bçå¼ç¨ç»cï¼åå½æ°bçä½ç¨åé¾å
å«äºå¯¹å½æ°açæ´»å¨å¯¹è±¡çå¼ç¨ï¼ä¹å°±æ¯è¯´bå¯ä»¥è®¿é®å°aä¸å®ä¹çææåéåå½æ°ãå½æ°b被cå¼ç¨ï¼å½æ°båä¾èµå½æ°aï¼å æ¤å½æ°aå¨è¿ååä¸ä¼è¢«GCåæ¶ã
å½å½æ°bæ§è¡çæ¶å亦ä¼å以ä¸æ¥éª¤ä¸æ ·ãå æ¤ï¼æ§è¡æ¶bçä½ç¨åé¾å
å«äº3个对象ï¼bçæ´»å¨å¯¹è±¡ãaçæ´»å¨å¯¹è±¡åwindow对象ï¼å¦ä¸å¾æ示ï¼
å¦å¾æ示ï¼å½å¨å½æ°bä¸è®¿é®ä¸ä¸ªåéçæ¶åï¼æ索顺åºæ¯å
æç´¢èªèº«çæ´»å¨å¯¹è±¡ï¼å¦æåå¨åè¿åï¼å¦æä¸åå¨å°ç»§ç»æç´¢å½æ°açæ´»å¨å¯¹è±¡ï¼ä¾ 次æ¥æ¾ï¼ç´å°æ¾å°ä¸ºæ¢ãå¦ææ´ä¸ªä½ç¨åé¾ä¸é½æ æ³æ¾å°ï¼åè¿åundefinedãå¦æå½æ°båå¨prototypeåå对象ï¼åå¨æ¥æ¾å®èªèº«çæ´»å¨å¯¹è±¡ åå
æ¥æ¾èªèº«çåå对象ï¼å继ç»æ¥æ¾ãè¿å°±æ¯Javascriptä¸çåéæ¥æ¾æºå¶ã
åãéå
çåºç¨åºæ¯
1ãä¿æ¤å½æ°å
çåéå®å
¨ã以æå¼å§çä¾å为ä¾ï¼å½æ°aä¸iåªæå½æ°bæè½è®¿é®ï¼èæ æ³éè¿å
¶ä»éå¾è®¿é®å°ï¼å æ¤ä¿æ¤äºiçå®å
¨æ§ã
2ãå¨å
åä¸ç»´æä¸ä¸ªåéãä¾ç¶å¦åä¾ï¼ç±äºéå
ï¼å½æ°aä¸içä¸ç´åå¨äºå
åä¸ï¼å æ¤æ¯æ¬¡æ§è¡c()ï¼é½ä¼ç»ièªå 1ã
以ä¸ä¸¤ç¹æ¯éå
æåºæ¬çåºç¨åºæ¯ï¼å¾å¤ç»å
¸æ¡ä¾é½æºäºæ¤ã
äºãJavascriptçåå¾åæ¶æºå¶
å¨Javascriptä¸ï¼å¦æä¸ä¸ªå¯¹è±¡ä¸å被å¼ç¨ï¼é£ä¹è¿ä¸ªå¯¹è±¡å°±ä¼è¢«GCåæ¶ãå¦æ两个对象äºç¸å¼ç¨ï¼èä¸å被第3è
æå¼ç¨ï¼é£ä¹è¿ä¸¤ä¸ªäºç¸å¼ç¨ç对象ä¹ä¼è¢«åæ¶ãå 为å½æ°a被bå¼ç¨ï¼bå被aå¤çcå¼ç¨ï¼è¿å°±æ¯ä¸ºä»ä¹å½æ°aæ§è¡åä¸ä¼è¢«åæ¶çåå ã
温馨提示:内容为网友见解,仅供参考