JavaScript æ¯ä¸ç§é常é¢å彿°çè¯è¨ãå®ç»äºæä»¬å¾å¤§çèªç±åº¦ãå¨ JavaScript ä¸ï¼æä»¬å¯ä»¥éæ¶åå»ºå½æ°ï¼å¯ä»¥å°å½æ°ä½ä¸ºåæ°ä¼ éç»å¦ä¸ä¸ªå½æ°ï¼å¹¶å¨å®å ¨ä¸åç代ç ä½ç½®è¿è¡è°ç¨ã
æä»¬å·²ç»ç¥é彿°å¯ä»¥è®¿é®å ¶å¤é¨çåéã
使¯ï¼å¦æå¨å½æ°è¢«å建ä¹åï¼å¤é¨åéåçäºååä¼ææ ·ï¼å½æ°ä¼è·å¾æ°å¼è¿æ¯æ§å¼ï¼
妿å°å½æ°ä½ä¸ºåæ°ï¼argumentï¼ä¼ éå¹¶å¨ä»£ç ä¸çå¦ä¸ä¸ªä½ç½®è°ç¨å®ï¼è¯¥å½æ°å°è®¿é®çæ¯æ°ä½ç½®çå¤é¨åéåï¼
让æä»¬éè¿æ¬ææ¥å¦ä¹ è¿äºç¸å ³ç¥è¯ï¼ä»¥äºè§£å¨è¿äºåºæ¯ä»¥åæ´å¤æçåºæ¯ä¸å°åºä¼åçä»ä¹ã
let/constå¨ JavaScript ä¸ï¼æä¸ç§å£°æåéçæ¹å¼ï¼letï¼constï¼ç°ä»£æ¹å¼ï¼ï¼varï¼è¿å»ç䏿¥çæ¹å¼ï¼ã
- 卿¬æç示ä¾ä¸ï¼æä»¬å°ä½¿ç¨
let声æåéã - ç¨
const声æçåéçè¡ä¸ºä¹ç¸åï¼è¯æ³¨ï¼ä¸letå¨ä½ç¨åçç¹æ§ä¸æ¯ç¸åçï¼ï¼å æ¤ï¼æ¬æä¹æ¶åç¨constè¿è¡åé声æã - æ§ç
varä¸ä¸é¢ä¸¤ä¸ªæçææ¾çåºå«ï¼æä»¬å°å¨ èæ§ç "var" ä¸è¯¦ç»ä»ç»ã
代ç å
妿å¨ä»£ç å {...} å
声æäºä¸ä¸ªåéï¼é£ä¹è¿ä¸ªåéåªå¨è¯¥ä»£ç åå
å¯è§ã
ä¾å¦ï¼
{
// 使ç¨å¨ä»£ç åå¤ä¸å¯è§çå±é¨åéåä¸äºå·¥ä½
let message = "Hello"; // åªå¨æ¤ä»£ç åå
å¯è§
alert(message); // Hello
}
alert(message); // Error: message is not defined
æä»¬å¯ä»¥ä½¿ç¨å®æ¥éç¦»ä¸æ®µä»£ç ï¼è¯¥æ®µä»£ç æ§è¡èªå·±çä»»å¡ï¼å¹¶ä½¿ç¨ä» å±äºèªå·±çåéï¼
{
// æ¾ç¤º message
let message = "Hello";
alert(message);
}
{
// æ¾ç¤ºå¦ä¸ä¸ª message
let message = "Goodbye";
alert(message);
}
请注æï¼å¦ææä»¬ä½¿ç¨ let 对已åå¨çåéè¿è¡éå¤å£°æï¼å¦æå¯¹åºçåéæ²¡æåç¬ç代ç åï¼åä¼åºç°é误ï¼
// æ¾ç¤º message
let message = "Hello";
alert(message);
// æ¾ç¤ºå¦ä¸ä¸ª message
let message = "Goodbye"; // Error: variable already declared
alert(message);
å¯¹äº ifï¼for å while çï¼å¨ {...} ä¸å£°æçåéä¹ä»
å¨å
é¨å¯è§ï¼
if (true) {
let phrase = "Hello!";
alert(phrase); // Hello!
}
alert(phrase); // Error, no such variable!
å¨è¿å¿ï¼å½ if æ§è¡å®æ¯ï¼åä¸é¢ç alert å°çä¸å° phraseï¼å æ¤ä¼åºç°é误ãï¼è¯æ³¨ï¼å°±ç®ä¸é¢ç alert æ³å¨ if 没æ§è¡å®ææ¶å»å phraseï¼è½ç¶è¿ç§æ
åµä¸å¯è½åçï¼ä¹æ¯åä¸å°çï¼å 为 let 声æçåéå¨ä»£ç åå¤ä¸å¯è§ãï¼
太好äºï¼å 为è¿å°±å
许æä»¬å建ç¹å®äº if 忝çå级å±é¨åéã
å¯¹äº for å while 循ç¯ä¹æ¯å¦æ¤ï¼
for (let i = 0; i < 3; i++) {
// åé i ä»
å¨è¿ä¸ª for 循ç¯çå
é¨å¯è§
alert(i); // 0ï¼ç¶åæ¯ 1ï¼ç¶åæ¯ 2
}
alert(i); // Error, no such variable
ä»è§è§ä¸çï¼let i ä½äº {...} ä¹å¤ã使¯ for æé å¨è¿éå¾ç¹æ®ï¼å¨å
¶ä¸å£°æçåé被è§ä¸ºåçä¸é¨åã
åµå¥å½æ°
妿ä¸ä¸ªå½æ°æ¯å¨å¦ä¸ä¸ªå½æ°ä¸å建çï¼è¯¥å½æ°å°±è¢«ç§°ä¸ºâåµå¥â彿°ã
å¨ JavaScript ä¸å¾å®¹æå®ç°è¿ä¸ç¹ã
æä»¬å¯ä»¥ä½¿ç¨åµå¥æ¥ç»ç»ä»£ç ï¼æ¯å¦è¿æ ·ï¼
function sayHiBye(firstName, lastName) {
// è¾
å©åµå¥å½æ°ä½¿ç¨å¦ä¸
function getFullName() {
return firstName + " " + lastName;
}
alert( "Hello, " + getFullName() );
alert( "Bye, " + getFullName() );
}
è¿éå建ç åµå¥ 彿° getFullName() æ¯ä¸ºäºæ´å æ¹ä¾¿ãå®å¯ä»¥è®¿é®å¤é¨åéï¼å æ¤å¯ä»¥è¿åå
¨åãåµå¥å½æ°å¨ JavaScript ä¸å¾å¸¸è§ã
æ´æææçæ¯ï¼å¯ä»¥è¿åä¸ä¸ªåµå¥å½æ°ï¼ä½ä¸ºä¸ä¸ªæ°å¯¹è±¡ç屿§æä½ä¸ºç»æè¿åãä¹åå¯ä»¥å¨å ¶ä»å°æ¹ä½¿ç¨ãä¸è®ºå¨åªéè°ç¨ï¼å®ä»ç¶å¯ä»¥è®¿é®ç¸åçå¤é¨åéã
ä¸é¢ç makeCounter å建äºä¸ä¸ª âcounterâ 彿°ï¼è¯¥å½æ°å¨æ¯æ¬¡è°ç¨æ¶è¿åä¸ä¸ä¸ªæ°åï¼
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
alert( counter() ); // 0
alert( counter() ); // 1
alert( counter() ); // 2
尽管å¾ç®åï¼ä½ç¨å ååå°±å ·æå¾å¼ºçå®é ç¨éï¼æ¯å¦ï¼ç¨ä½ éæºæ°çæå¨ 以çæç¨äºèªå¨åæµè¯çéæºæ°å¼ã
è¿æ¯å¦ä½è¿ä½çå¢ï¼å¦ææä»¬å建å¤ä¸ªè®¡æ°å¨ï¼å®ä»¬ä¼æ¯ç¬ç«çåï¼è¿éçå鿝æä¹åäºï¼
çè§£è¿äºå å®¹å¯¹äºææ¡ JavaScript çæ´ä½ç¥è¯å¾æå¸®å©ï¼å¹¶ä¸å¯¹äºåºå¯¹æ´å¤æçåºæ¯ä¹å¾æçå¤ãå æ¤ï¼è®©æä»¬ç»§ç»æ·±å ¥æ¢ç©¶ã
è¯æ³ç¯å¢
ä¸å¤§æ³¢æ·±å ¥çææ¯è®²è§£å³å°å°æ¥ã
尽管æå¾æ³é¿å ç¼ç¨è¯è¨çä¸äºåºå±ç»èï¼ä½æ¯å¦ææ²¡æå®ä»¬ï¼æä»¬å°±æ æ³å®æ´å°çè§£è¯æ³ä½ç¨åï¼æä»¥æä»¬è¿å°±å¼å§å§ï¼
为äºä½¿å å®¹æ´æ¸ æ°ï¼è¿éå°åæ¥éª¤è¿è¡è®²è§£ã
Step 1. åé
å¨ JavaScript ä¸ï¼æ¯ä¸ªè¿è¡ç彿°ï¼ä»£ç å {...} ä»¥åæ´ä¸ªèæ¬ï¼é½æä¸ä¸ªè¢«ç§°ä¸º è¯æ³ç¯å¢ï¼Lexical Environmentï¼ çå
é¨ï¼éèï¼çå
³è对象ã
è¯æ³ç¯å¢å¯¹è±¡ç±ä¸¤é¨åç»æï¼
- ç¯å¢è®°å½ï¼Environment Recordï¼ ââ ä¸ä¸ªå卿æå±é¨åéä½ä¸ºå
¶å±æ§ï¼å
æ¬ä¸äºå
¶ä»ä¿¡æ¯ï¼ä¾å¦
thisçå¼ï¼ç对象ã - 对 å¤é¨è¯æ³ç¯å¢ çå¼ç¨ï¼ä¸å¤é¨ä»£ç ç¸å ³èã
ä¸ä¸ªâåéâåªæ¯ ç¯å¢è®°å½ è¿ä¸ªç¹æ®çå é¨å¯¹è±¡çä¸ä¸ªå±æ§ãâè·åæä¿®æ¹åéâæå³çâè·åæä¿®æ¹è¯æ³ç¯å¢çä¸ä¸ªå±æ§âã
举个ä¾åï¼è¿æ®µæ²¡æå½æ°çç®åç代ç ä¸åªæä¸ä¸ªè¯æ³ç¯å¢ï¼
è¿å°±æ¯æè°ç䏿´ä¸ªèæ¬ç¸å ³èç å ¨å± è¯æ³ç¯å¢ã
å¨ä¸é¢çå¾çä¸ï¼ç©å½¢è¡¨ç¤ºç¯å¢è®°å½ï¼åéåå¨ï¼ï¼ç®å¤´è¡¨ç¤ºå¤é¨å¼ç¨ãå
¨å±è¯æ³ç¯å¢æ²¡æå¤é¨å¼ç¨ï¼æä»¥ç®å¤´æåäº nullã
éç代ç å¼å§å¹¶ç»§ç»è¿è¡ï¼è¯æ³ç¯å¢åçäºååã
è¿æ¯æ´é¿ç代ç ï¼
å³ä¾§çç©å½¢æ¼ç¤ºäºæ§è¡è¿ç¨ä¸å ¨å±è¯æ³ç¯å¢çååï¼
- å½èæ¬å¼å§è¿è¡ï¼è¯æ³ç¯å¢é¢å
å¡«å
äºææå£°æçåéã
- æåï¼å®ä»¬å¤äºâæªåå§åï¼Uninitializedï¼âç¶æãè¿æ¯ä¸ç§ç¹æ®çå
é¨ç¶æï¼è¿æå³ç弿ç¥éåéï¼ä½æ¯å¨ç¨
let声æåï¼ä¸è½å¼ç¨å®ãå ä¹å°±ååéä¸åå¨ä¸æ ·ã
- æåï¼å®ä»¬å¤äºâæªåå§åï¼Uninitializedï¼âç¶æãè¿æ¯ä¸ç§ç¹æ®çå
é¨ç¶æï¼è¿æå³ç弿ç¥éåéï¼ä½æ¯å¨ç¨
- ç¶å
let phraseå®ä¹åºç°äºãå®å°æªè¢«èµå¼ï¼å æ¤å®çå¼ä¸ºundefinedãä»è¿ä¸å»èµ·ï¼æä»¬å°±å¯ä»¥ä½¿ç¨åéäºã phrase被èµäºäºä¸ä¸ªå¼ãphraseçå¼è¢«ä¿®æ¹ã
ç°å¨çèµ·æ¥é½æºç®åçï¼æ¯å§ï¼
- åéæ¯ç¹æ®å é¨å¯¹è±¡ç屿§ï¼ä¸å½åæ£å¨æ§è¡çï¼ä»£ç ï¼å/彿°/èæ¬æå ³ã
- æä½åéå®é 䏿¯æä½è¯¥å¯¹è±¡ç屿§ã
âè¯æ³ç¯å¢âæ¯ä¸ä¸ªè§è对象ï¼specification objectï¼ï¼å®åªåå¨äº è¯è¨è§è çâç论âå±é¢ï¼ç¨äºæè¿°äºç©æ¯å¦ä½å·¥ä½çãæä»¬æ æ³å¨ä»£ç ä¸è·åè¯¥å¯¹è±¡å¹¶ç´æ¥å¯¹å ¶è¿è¡æä½ã
ä½ JavaScript å¼æåæ ·å¯ä»¥ä¼åå®ï¼æ¯å¦æ¸ 餿ªè¢«ä½¿ç¨çåé以èçå ååæ§è¡å ¶ä»å 鍿巧çï¼ä½æ¾æ§è¡ä¸ºåºè¯¥æ¯åä¸è¿°çæ å·®ã
Step 2. 彿°å£°æ
ä¸ä¸ªå½æ°å ¶å®ä¹æ¯ä¸ä¸ªå¼ï¼å°±ååé䏿 ·ã
ä¸åä¹å¤å¨äºå½æ°å£°æçåå§åä¼è¢«ç«å³å®æã
å½å建äºä¸ä¸ªè¯æ³ç¯å¢ï¼Lexical Environmentï¼æ¶ï¼å½æ°å£°æä¼ç«å³å为å³ç¨å彿°ï¼ä¸å let 飿 ·ç´å°å£°æå¤æå¯ç¨ï¼ã
è¿å°±æ¯ä¸ºä»ä¹æä»¬çè³å¯ä»¥å¨å£°æèªèº«ä¹åè°ç¨ä¸ä¸ªä»¥å½æ°å£°æï¼Function Declarationï¼çæ¹å¼å£°æç彿°ã
ä¾å¦ï¼è¿æ¯æ·»å ä¸ä¸ªå½æ°æ¶å ¨å±è¯æ³ç¯å¢çåå§ç¶æï¼
æ£å¸¸æ¥è¯´ï¼è¿ç§è¡ä¸ºä»
éç¨äºå½æ°å£°æï¼èä¸éç¨äºæä»¬å°å½æ°åé
ç»åéç彿°è¡¨è¾¾å¼ï¼ä¾å¦ let say = function(name)...ã
Step 3. å é¨åå¤é¨çè¯æ³ç¯å¢
å¨ä¸ä¸ªå½æ°è¿è¡æ¶ï¼å¨è°ç¨åå¼å§æ¶ï¼ä¼èªå¨å建ä¸ä¸ªæ°çè¯æ³ç¯å¢ä»¥åå¨è¿ä¸ªè°ç¨çå±é¨åéååæ°ã
ä¾å¦ï¼å¯¹äº say("John")ï¼å®çèµ·æ¥åè¿æ ·ï¼å½åæ§è¡ä½ç½®å¨ç®å¤´æ è®°çé£ä¸è¡ä¸ï¼ï¼
å¨è¿ä¸ªå½æ°è°ç¨æé´ï¼æä»¬æä¸¤ä¸ªè¯æ³ç¯å¢ï¼å é¨ä¸ä¸ªï¼ç¨äºå½æ°è°ç¨ï¼åå¤é¨ä¸ä¸ªï¼å ¨å±ï¼ï¼
- å
é¨è¯æ³ç¯å¢ä¸
sayçå½åæ§è¡ç¸å¯¹åºãå®å ·æä¸ä¸ªåç¬ç屿§ï¼nameï¼å½æ°çåæ°ãæä»¬è°ç¨çæ¯say("John")ï¼æä»¥nameçå¼ä¸º"John"ã - å¤é¨è¯æ³ç¯å¢æ¯å
¨å±è¯æ³ç¯å¢ãå®å
·æ
phraseåéå彿°æ¬èº«ã
å
é¨è¯æ³ç¯å¢å¼ç¨äº outerã
å½ä»£ç è¦è®¿é®ä¸ä¸ªåéæ¶ ââ é¦å ä¼æç´¢å é¨è¯æ³ç¯å¢ï¼ç¶åæç´¢å¤é¨ç¯å¢ï¼ç¶åæç´¢æ´å¤é¨çç¯å¢ï¼ä»¥æ¤ç±»æ¨ï¼ç´å°å ¨å±è¯æ³ç¯å¢ã
妿å¨ä»»ä½å°æ¹é½æ¾ä¸å°è¿ä¸ªåéï¼é£ä¹å¨ä¸¥æ ¼æ¨¡å¼ä¸å°±ä¼æ¥éï¼å¨éä¸¥æ ¼æ¨¡å¼ä¸ï¼ä¸ºäºåä¸å ¼å®¹ï¼ç»æªå®ä¹çåéèµå¼ä¼å建ä¸ä¸ªå ¨å±åéï¼ã
å¨è¿ä¸ªç¤ºä¾ä¸ï¼æç´¢è¿ç¨å¦ä¸ï¼
- 对äº
nameåéï¼å½sayä¸çalertè¯å¾è®¿é®nameæ¶ï¼ä¼ç«å³å¨å é¨è¯æ³ç¯å¢ä¸æ¾å°å®ã - å½å®è¯å¾è®¿é®
phraseæ¶ï¼ç¶èå 鍿²¡æphraseï¼æä»¥å®é¡ºç对å¤é¨è¯æ³ç¯å¢çå¼ç¨æ¾å°äºå®ã
Step 4. è¿å彿°
让æä»¬åå° makeCounter è¿ä¸ªä¾åã
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
卿¯æ¬¡ makeCounter() è°ç¨çå¼å§ï¼é½ä¼å建ä¸ä¸ªæ°çè¯æ³ç¯å¢å¯¹è±¡ï¼ä»¥åå¨è¯¥ makeCounter è¿è¡æ¶çåéã
å æ¤ï¼æä»¬æä¸¤å±åµå¥çè¯æ³ç¯å¢ï¼å°±åä¸é¢ç示ä¾ä¸æ ·ï¼
ä¸åçæ¯ï¼å¨æ§è¡ makeCounter() çè¿ç¨ä¸å建äºä¸ä¸ªä»
å ä¸è¡çåµå¥å½æ°ï¼return count++ãæä»¬å°æªè¿è¡å®ï¼ä»
å建äºå®ã
ææç彿°å¨âè¯çâæ¶é½ä¼è®°ä½å建å®ä»¬çè¯æ³ç¯å¢ã仿æ¯ä¸è®²ï¼è¿é没æä»ä¹éæ³ï¼ææå½æ°é½æå为 [[Environment]] çéè屿§ï¼è¯¥å±æ§ä¿åäºå¯¹åå»ºè¯¥å½æ°çè¯æ³ç¯å¢çå¼ç¨ã
å æ¤ï¼counter.[[Environment]] æå¯¹ {count: 0} è¯æ³ç¯å¢çå¼ç¨ãè¿å°±æ¯å½æ°è®°ä½å®å建äºä½å¤çæ¹å¼ï¼ä¸å½æ°è¢«å¨åªå¿è°ç¨æ å
³ã[[Environment]] å¼ç¨å¨å½æ°å建æ¶è¢«è®¾ç½®å¹¶æ°¸ä¹
ä¿åã
ç¨åï¼å½è°ç¨ counter() æ¶ï¼ä¼ä¸ºè¯¥è°ç¨å建ä¸ä¸ªæ°çè¯æ³ç¯å¢ï¼å¹¶ä¸å
¶å¤é¨è¯æ³ç¯å¢å¼ç¨è·åäº counter.[[Environment]]ï¼
ç°å¨ï¼å½ counter() ä¸çä»£ç æ¥æ¾ count åéæ¶ï¼å®é¦å
æç´¢èªå·±çè¯æ³ç¯å¢ï¼ä¸ºç©ºï¼å 为é£é没æå±é¨åéï¼ï¼ç¶åæ¯å¤é¨ makeCounter() çè¯æ³ç¯å¢ï¼å¹¶ä¸å¨åªéæ¾å°å°±å¨åªéä¿®æ¹ã
å¨åéæå¨çè¯æ³ç¯å¢ä¸æ´æ°åéã
è¿æ¯æ§è¡åçç¶æï¼
妿æä»¬è°ç¨ counter() 夿¬¡ï¼count åéå°å¨åä¸ä½ç½®å¢å å° 2ï¼3 çã
å¼åè é常åºè¯¥é½ç¥éâéå âè¿ä¸ªéç¨çç¼ç¨æ¯è¯ã
éå æ¯æä¸ä¸ªå½æ°å¯ä»¥è®°ä½å ¶å¤é¨åéå¹¶å¯ä»¥è®¿é®è¿äºåéã卿äºç¼ç¨è¯è¨ä¸ï¼è¿æ¯ä¸å¯è½çï¼æè åºè¯¥ä»¥ä¸ç§ç¹æ®çæ¹å¼ç¼å彿°æ¥å®ç°ãä½å¦ä¸æè¿°ï¼å¨ JavaScript ä¸ï¼ææå½æ°é½æ¯å¤©çéå çï¼åªæä¸ä¸ªä¾å¤ï¼å°å¨ "new Function" è¯æ³ ä¸è®²å°ï¼ã
ä¹å°±æ¯è¯´ï¼JavaScript ä¸ç彿°ä¼èªå¨éè¿éèç [[Environment]] 屿§è®°ä½å建å®ä»¬çä½ç½®ï¼æä»¥å®ä»¬é½å¯ä»¥è®¿é®å¤é¨åéã
å¨é¢è¯æ¶ï¼å端å¼åè
é常ä¼è¢«é®å°âä»ä¹æ¯éå
ï¼âï¼æ£ç¡®çåçåºè¯¥æ¯éå
çå®ä¹ï¼å¹¶è§£éæ¸
æ¥ä¸ºä»ä¹ JavaScript ä¸çææå½æ°é½æ¯éå
çï¼ä»¥åå¯è½çå
³äº [[Environment]] 屿§åè¯æ³ç¯å¢åççææ¯ç»èã
å徿¶é
é常ï¼å½æ°è°ç¨å®æåï¼ä¼å°è¯æ³ç¯å¢åå ¶ä¸çææåéä»å åä¸å é¤ãå 为ç°å¨æ²¡æä»»ä½å¯¹å®ä»¬çå¼ç¨äºãä¸ JavaScript ä¸çä»»ä½å ¶ä»å¯¹è±¡ä¸æ ·ï¼è¯æ³ç¯å¢ä» å¨å¯è¾¾æ¶æä¼è¢«ä¿çå¨å åä¸ã
使¯ï¼å¦ææä¸ä¸ªåµå¥ç彿°å¨å½æ°ç»æåä»å¯è¾¾ï¼åå®å°å
·æå¼ç¨è¯æ³ç¯å¢ç [[Environment]] 屿§ã
å¨ä¸é¢è¿ä¸ªä¾åä¸ï¼å³ä½¿å¨ï¼å¤é¨ï¼å½æ°æ§è¡å®æåï¼å®çè¯æ³ç¯å¢ä»ç¶å¯è¾¾ãå æ¤ï¼æ¤è¯æ³ç¯å¢ä»ç¶ææã
ä¾å¦ï¼
function f() {
let value = 123;
return function() {
alert(value);
}
}
let g = f(); // g.[[Environment]] åå¨äºå¯¹ç¸åº f() è°ç¨çè¯æ³ç¯å¢çå¼ç¨
请注æï¼å¦æå¤æ¬¡è°ç¨ f()ï¼å¹¶ä¸è¿åç彿°è¢«ä¿åï¼é£ä¹ææç¸åºçè¯æ³ç¯å¢å¯¹è±¡ä¹ä¼ä¿çå¨å
åä¸ãä¸é¢ä»£ç 䏿ä¸ä¸ªè¿æ ·ç彿°ï¼
function f() {
let value = Math.random();
return function() { alert(value); };
}
// æ°ç»ä¸ç 3 ä¸ªå½æ°ï¼æ¯ä¸ªé½ä¸æ¥èªå¯¹åºç f() çè¯æ³ç¯å¢ç¸å
³è
let arr = [f(), f(), f()];
å½è¯æ³ç¯å¢å¯¹è±¡åå¾ä¸å¯è¾¾æ¶ï¼å®å°±ä¼æ»å»ï¼å°±åå ¶ä»ä»»ä½å¯¹è±¡ä¸æ ·ï¼ãæ¢å¥è¯è¯´ï¼å®ä» å¨è³å°æä¸ä¸ªåµå¥å½æ°å¼ç¨å®æ¶æåå¨ã
å¨ä¸é¢ç代ç ä¸ï¼åµå¥å½æ°è¢«å é¤åï¼å
¶å°éçè¯æ³ç¯å¢ï¼ä»¥åå
¶ä¸ç valueï¼ä¹ä¼è¢«ä»å
åä¸å é¤ï¼
function f() {
let value = 123;
return function() {
alert(value);
}
}
let g = f(); // å½ g 彿°å卿¶ï¼è¯¥å¼ä¼è¢«ä¿çå¨å
åä¸
g = null; // â¦â¦ç°å¨å
å被æ¸
çäº
å®é å¼åä¸çä¼å
æ£å¦æä»¬æçå°çï¼ç论ä¸å½å½æ°å¯è¾¾æ¶ï¼å®å¤é¨çææåéä¹é½å°åå¨ã
ä½å¨å®é ä¸ï¼JavaScript 弿ä¼è¯å¾ä¼åå®ãå®ä»¬ä¼åæåéçä½¿ç¨æ åµï¼å¦æä»ä»£ç ä¸å¯ä»¥ææ¾çåºææªä½¿ç¨çå¤é¨åéï¼é£ä¹å°±ä¼å°å ¶å é¤ã
å¨ V8ï¼Chromeï¼Edgeï¼Operaï¼ä¸çä¸ä¸ªéè¦çå¯ä½ç¨æ¯ï¼æ¤ç±»åéå¨è°è¯ä¸å°ä¸å¯ç¨ã
æå¼ Chrome æµè§å¨çå¼åè å·¥å ·ï¼å¹¶å°è¯è¿è¡ä¸é¢ç代ç ã
å½ä»£ç æ§è¡æåæ¶ï¼å¨æ§å¶å°ä¸è¾å
¥ alert(value)ã
function f() {
let value = Math.random();
function g() {
debugger; // å¨ Console ä¸ï¼è¾å
¥ alert(value); No such variable!
}
return g;
}
let g = f();
g();
æ£å¦ä½ æè§ç ââ No such variable! ç论ä¸ï¼å®åºè¯¥æ¯å¯ä»¥è®¿é®çï¼ä½å¼ææå®ä¼åæäºã
è¿å¯è½ä¼å¯¼è´æè¶£çï¼å¦æä¸æ¯é£ä¹èæ¶çï¼è°è¯é®é¢ãå ¶ä¸ä¹ä¸ ââ æä»¬å¯ä»¥çå°çæ¯ä¸ä¸ªååçå¤é¨åéï¼è䏿¯é¢æçåéï¼
let value = "Surprise!";
function f() {
let value = "the closest value";
function g() {
debugger; // å¨ console ä¸ï¼è¾å
¥ alert(value); Surprise!
}
return g;
}
let g = f();
g();
V8 弿çè¿ä¸ªç¹æ§ä½ ççåºè¯¥ç¥éãå¦æä½ è¦ä½¿ç¨ Chrome/Edge/Opera è¿è¡ä»£ç è°è¯ï¼è¿æ©ä¼éå°è¿æ ·çé®é¢ã
è¿ä¸æ¯è°è¯å¨ç bugï¼èæ¯ V8 çä¸ä¸ªç¹å«çç¹æ§ãä¹è®¸ä»¥åä¼è¢«ä¿®æ¹ãä½ å§ç»å¯ä»¥éè¿è¿è¡æ¬æä¸çç¤ºä¾æ¥è¿è¡æ£æ¥ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼