ãªãã£ãŒãã³ãŒã³ãã©ãŒã
Javascript Closuresã«ãã翻蚳ã
- ã¯ããã«
- ãªããžã§ã¯ãããããã£ã®åå解決
- å€ã®å²ãåœãŠ
- å€ã®èªã¿åã
- èå¥åã®åå解決ãå®è¡ã³ã³ããã¹ããããã³ã¹ã³ãŒããã§ãŒã³
- å®è¡ã³ã³ããã¹ã
- ã¹ã³ãŒããã§ãŒã³ãš[[scope]]ããããã£
- èå¥åã®åå解決
- ...
ã¯ããã«
ç絡
ã¯ããŒãžã£ãŒã¯ãèªç±å€æ°ãæã€ããšãã§ããåŒïŒéåžžã¯é¢æ°ïŒã§ããããããã®å€æ°ããã€ã³ãããç°å¢ïŒã€ãŸãããã®åŒãéããïŒãæã€ããšãã§ããŸãã
ã¯ããŒãžã£ãŒã¯ECMAScriptïŒjavascriptïŒã®æã匷åãªæ©èœã®1ã€ã§ãããçè§£ãªãããŠé©åã«é©çšããããšã¯ã§ããŸããã å¶ç¶ã§ãç°¡åã«äœæã§ãããšããäºå®ã«ãããããããç¹ã«æ¯èŒçäžè¬çãªãã©ãŠã¶ç°å¢ã§ã¯ãäœæãæå®³ãªçµæãããããå¯èœæ§ããããŸãã é害ãšã®å¶çºçãªè¡çªãé¿ããé害ãå©çšããã«ã¯ããã®ã¡ã«ããºã ãçè§£ããå¿
èŠããããŸãã ããã¯ãèå¥åã®è§£æ±ºã«ãããã¹ã³ãŒããã§ãŒã³ã®åœ¹å²ãšããªããžã§ã¯ãã®ããããã£åã®è§£æ±ºã«å€§ããäŸåããŸãã
ã¯ããŒãžã£ãŒã®æãç°¡åãªèª¬æã¯ãECMAScriptãä»ã®é¢æ°ã®æ¬äœå
ã«ãã¹ãããã颿°ã颿°å®çŸ©ãããã³é¢æ°åŒãèš±å¯ãããšããããšã§ãã ãŸãããããã®ãã¹ãããã颿°ã¯ãå€éšé¢æ°ïŒå€éšé¢æ°ïŒå
ã®ãã¹ãŠã®ããŒã«ã«å€æ°ããã©ã¡ãŒã¿ãŒãããã³é¢æ°ã«ã¢ã¯ã»ã¹ã§ããŸãã ãããã®ãã¹ãããã颿°ã®1ã€ãå«ãŸããŠãã颿°ã®å€éšã§äœ¿çšå¯èœã«ãªããšãã¯ããŒãžã£ãŒã圢æããããããå€éšé¢æ°ã®å®äºåŸã«å®è¡ã§ããŸãã ãã®æç¹ã§ã圌女ã¯ãŸã ããŒã«ã«å€æ°ããã©ã¡ãŒã¿ãŒãããã³å€éšé¢æ°ã®å
éšé¢æ°å®£èšã«ã¢ã¯ã»ã¹ã§ããŸãã ãããã®ããŒã«ã«å€æ°ããã©ã¡ãŒã¿ãŒãããã³é¢æ°å®£èšã¯ïŒæåã¯ïŒå€éšé¢æ°ãå®äºãããšããšåãå€ãæã¡ãå
éšé¢æ°ãšå¯Ÿè©±ã§ããŸãã
æ®å¿µãªãããã¯ããŒãžã£ãŒãé©åã«çè§£ããã«ã¯ãã¯ããŒãžã£ãŒã®èåŸã«ããã¡ã«ããºã ãçè§£ããå€ãã®æè¡çãªè©³çްãç¥ãå¿
èŠããããŸãã 以äžã®èª¬æã®åé ã§ECMA 262ã§å®çŸ©ãããŠããã¢ã«ãŽãªãºã ã®äžéšã«ã€ããŠèª¬æããŠããŸãããã»ãšãã©ã®ã¢ã«ãŽãªãºã ãçç¥ããããåçŽåããŠåçŽåãããããããšã¯ã§ããŸããã ãªããžã§ã¯ãã®ããããã£åã®è§£æ±ºã«ç²ŸéããŠããå Žåã¯ããã®ã»ã¯ã·ã§ã³ãã¹ãããã§ããŸãããã¯ããŒãžã£ãŒã«æ¢ã«ç²ŸéããŠãã人ã ããåŸç¶ã®ã»ã¯ã·ã§ã³ãã¹ãããããä»ããèªãã®ããããŠãããã®äœ¿çšã«æ»ãããšãã§ããŸãã
ãªããžã§ã¯ãããããã£ã®åå解決
ECMAScriptã¯ããã€ãã£ããªããžã§ã¯ããšãã¹ããªããžã§ã¯ããããã³çµã¿èŸŒã¿ãªããžã§ã¯ããšåŒã°ãããã€ãã£ããªããžã§ã¯ãã®ãµãã«ããŽãªã®2ã€ã®ã«ããŽãªã®ãªããžã§ã¯ããèªèããŸãïŒECMA 262 3rd Ed Section 4.3ïŒã ãã€ãã£ããªããžã§ã¯ãã¯èšèªã«å±ãããã¹ããªããžã§ã¯ãã¯ç°å¢ã«ãã£ãŠæäŸãããããšãã°ããã¥ã¡ã³ããªããžã§ã¯ããDOMããŒããªã©ã«ãªããŸãã
ãã€ãã£ããªããžã§ã¯ãã¯ãååä»ãããããã£ã®ç¡æã®åçã³ã³ããã§ãïŒäžéšã®å®è£
ã¯ãåã蟌ã¿ãªããžã§ã¯ãã®ãµãã«ããŽãªã«ãªããšããã»ã©åçã§ã¯ãããŸããããéåžžã¯éèŠã§ã¯ãããŸããïŒã ãã€ãã£ããªããžã§ã¯ãã®ç¹å®ã®ååä»ãããããã£ã¯ãå¥ã®ãªããžã§ã¯ãïŒãã®æå³ã§ã¯é¢æ°ã§ããããŸãïŒãžã®åç
§ãšãªãå€ããŸãã¯åºæ¬å€ãStringãNumberãBooleanãNullããŸãã¯Undefinedãæ ŒçŽããŸãã ããªããã£ãåUndefinedã¯ããªããžã§ã¯ãã®ããããã£ã
undefinedã«èšå®ã§ãããšããæå³ã§å°ãçããã§ãããããããã£ã¯ãªããžã§ã¯ãããåé€ãããŸããã ãªããžã§ã¯ãã®ååä»ãããããã£ã®ãŸãŸã§ãããå€
undefinedãåã«æ ŒçŽããŸãã
以äžã¯ããªããžã§ã¯ãã®ããããã£ãã©ã®ããã«èªã¿åãããŠèšå®ãããå
éšã®è©³çްã«å¯èœãªéã圱é¿ãäžãããã«ã€ããŠã®ç°¡åãªèª¬æã§ãã
å€ã®å²ãåœãŠ
ãªããžã§ã¯ãã®ååä»ãããããã£ãäœæããããæ¢åã®ååä»ãããããã£ã®å€ãèšå®ããã«ã¯ãååä»ãããããã£ã«å€ãå²ãåœãŠãŸãã
ãã®ããã«
var objectRef = new Object();
ãtestNumberããšããååã®ããããã£ã¯ã次ã®ããã«äœæã§ããŸãã
objectRef.testNumber = 5; objectRef["testNumber"] = 5;
ãªããžã§ã¯ãã«ã¯ãå€ãå²ãåœãŠãåã«
testNumberããããã£ããããŸããã§ãããã
åŸã§äœæãããŸããã 以éã®å²ãåœãŠã§ã¯ããã®ããããã£ãäœæããå¿
èŠã¯ãããŸãããå€ã倿Žããã ãã§ãã
objectRef.testNumber = 8; objectRef["testNumber"] = 8;
Javascriptãªããžã§ã¯ãã«ã¯ã以äžã§ç°¡åã«èª¬æããããã«ãããèªäœããªããžã§ã¯ãã«ãªãå¯èœæ§ã®ãããããã¿ã€ããããããããã®ãããã¿ã€ãã«ã¯ååä»ãããããã£ãå«ããããšãã§ããŸãã ãã ããããã¯å²ãåœãŠã«ã¯é©çšãããŸããã å€ãå²ãåœãŠããããªããžã§ã¯ãã«å¯Ÿå¿ããååã®ããããã£ããªãå Žåããã®ããããã£ãäœæãããå€ãå²ãåœãŠãããŸãã ãªããžã§ã¯ãã«ãã®ãããªããããã£ãããå Žåããã®å€ã¯ãªã»ãããããŸãã
å€ã®èªã¿åã
ãªããžã§ã¯ãã®ãããã¿ã€ãã䜿çšãããã®ã¯ãå€ãèªã¿åããšãã§ãã ãªããžã§ã¯ãã«ããããã£ã¢ã¯ã»ãµãŒåŒã§äœ¿çšãããååã®ããããã£ãããå Žåããã®ããããã£ã®å€ãè¿ãããŸã
objectRef.testNumber = 8; var val = objectRef.testNumber;
ãããããã¹ãŠã®ãªããžã§ã¯ãã¯ãããã¿ã€ããæã€ããšãã§ãããããã¿ã€ãã¯ãªããžã§ã¯ãã§ããããããã¿ã€ããæã€ããšãã§ãããããã¿ã€ããªã©ãæã€ããšãã§ãããããã¿ã€ããã§ãŒã³ãšåŒã°ãããã®ã圢æããŸãã ãããã¿ã€ããã§ãŒã³ã¯ããã§ãŒã³å
ã®ãªããžã§ã¯ãã®1ã€ã«
nullãããã¿ã€ãããããšçµäºã
ãŸã ã
Objectã³ã³ã¹ãã©ã¯ã¿ãŒã§ããã©ã«ãã§äœ¿çšããããããã¿ã€ãã«ã¯ã
nullãããã¿ã€ããããããã
var objectRef = new Object();
ãããã¿ã€ã
Object.prototypeã䜿çšããŠãªããžã§ã¯ããäœæããŸããããèªäœã¯
nullãããã¿ã€ããæã¡
ãŸã ã æ¬¡ã«ã
objectRefãªããžã§ã¯ãã®ãããã¿ã€ããã§ãŒã³ã«ã¯ã
Object.prototypeãšãã 1ã€ã®ãªããžã§ã¯ãã®ã¿ãå«ãŸããŸãã ããã
function MyObject1(formalParameter){ this.testNumber = formalParameter; } function MyObject2(formalParameter){ this.testString = formalParameter; } MyObject2.prototype = new MyObject1( 8 ); var objectRef = new MyObject2( "String_Value" );
倿°
objectRefã«ãã£ãŠåç
§ããã
MyObject2ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ããããã¿ã€ããã§ãŒã³ããããŸãã ãã®ãã§ãŒã³ã®æåã®ãªããžã§ã¯ãã¯
MyObject1ã®ã€ã³ã¹ã¿ã³ã¹ã§ãäœæããã
MyObject2ã³ã³ã¹ãã©ã¯ã¿ãŒã®
prototypeããããã£ã«å²ãåœãŠãããŠã
ãŸã ã
MyObject1ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ãããã©ã«ãã§
MyObject1ã®
prototypeããããã£ã«å²ãåœãŠããããããã¿ã€ããªããžã§ã¯ãããããŸãã ãã®ãããã¿ã€ãã¯
Objectã®ããã©ã«ãã®ãããã¿ã€ãã§ãã
Object.prototypeã«ãã£ãŠåç
§ããããªããžã§ã¯ãã
Object.prototypeã«ã¯
nullãããã¿ã€ããããããããã§ãŒã³ã¯ãã®æç¹ã§çµäºããŸãã
ããããã£ã¢ã¯ã»ã¹åŒã
objectRefã«ãã£ãŠåç
§ããããªããžã§ã¯ãããååä»ãããããã£ãèªã¿åãããšãããšããããã¿ã€ããã§ãŒã³å
šäœãããã»ã¹ã«åå ã§ããŸãã åçŽãªå Žå
var val = objectRef.testString;
-objectRefãä»ããŠã¢ã¯ã»ã¹å¯èœãª
MyObject2ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯
testStringãšããããããã£ãããããããã®ããããã£ã®å€ã¯
String_Valueã«èšå®ããã倿°
valã«å²ãåœãŠãããŸãã
ããã
var val = objectRef.testNumber;
MyObject2颿°ã®ã€ã³ã¹ã¿ã³ã¹ããããããã£ãèªã¿åãããšãã§ããªãããã ãã®ãããªããããã£ã¯ãããŸãããã倿°
val㯠8ã«èšå®ããã
undefinedã§ã¯ãããŸãããããã¯ããªããžã§ã¯ãèªäœã®å¯Ÿå¿ããååä»ãããããã£ã®æ€çŽ¢ã倱æãããããã€ã³ã¿ããªã¿ããã®ãããã¿ã€ãã§ãããªããžã§ã¯ãããã§ãã¯ããããã§ã ãã®ãããã¿ã€ãã¯ããã®ããããã£ã«å€
8ãå²ãåœãŠããã
testNumberããããã£ã§äœæããã颿°
MyObject1ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããããããããã£ãžã®ã¢ã¯ã»ã¹ã®åŒã¯å€
8ãšããŠèšç®ãããŸãã
MyObject1ã
MyObject2ã
toStringã¡ãœãããå®çŸ©ããŸããããããããã£ã¢ã¯ã»ã¹åŒã
objectRefãã
toStringããããã£ã®å€ãèªã¿åãããšãããšã
var val = objectRef.toString;
次ã«ã
val倿°ã«é¢æ°åç
§ãå²ãåœãŠãããŸãã ãã®é¢æ°ã¯
Object.prototypeãªããžã§ã¯ãã®
toStringããããã£ã§ããããããã¿ã€ãæ€èšŒããã»ã¹ã®çµæãšããŠè¿ãããŸãïŒ
objectRefãªããžã§ã¯ãã
ãã§ãã¯ãã ããã®äžã«
toStringããããã£ãæ¬ èœããåŸã
objectRefãããã¿ã€ãã
ãã§ãã¯ãã ããã®ããããã£ããªãããšã倿ãããšãã®ãããã¿ã€ãã¯ãã¹ãäžã§ãã ãã®ãããã¿ã€ãã¯
Object.prototypeã§ã
toStringã¡ãœãããããããªã³ã¯ã¯ãã®é¢æ°ã«æ»ããŸãã
çµè«ãšããŠïŒ
var val = objectRef.madeUpProperty;
-ãããã¿ã€ããã§ãŒã³ãåŠçããããã»ã¹ãã©ã®ãªããžã§ã¯ãã«ã
madeUpPropertyãšããååã®ããããã£ãèŠã€ããããªãããã
undefinedãè¿ããæçµçã«
Object.prototypeãªããžã§ã¯ãã®ãããã¿ã€ãã«å°éããŸãã
nullã®å Žåã
undefinedãè¿ãããšã§ããã»ã¹ãçµäºããŸãã
ååä»ãããããã£ãèªã¿åããšããªããžã§ã¯ããŸãã¯ãã®ãããã¿ã€ããã§ãŒã³ããæåã«èŠã€ãã£ãå€ãè¿ãããŸãã 察å¿ããããããã£ãååšããªãå Žåããªããžã§ã¯ãã®ååä»ãããããã£ã«å€ãå²ãåœãŠããšããªããžã§ã¯ãèªäœã«ããããã£ãäœæãããŸãã
ããã¯ãå€ã
objectRef.testNumber = 3ã«å²ãåœãŠãããå Žåã
testNumberããããã£ã
MyObject2颿°ã®ã€ã³ã¹ã¿ã³ã¹ã§äœæããããã®åŸå€ãèªã¿åãããšãããšããªããžã§ã¯ãã«èšå®ãããå€ãè¿ãããããšãæå³ããŸãã ããã§ãããããã£ã®ã¢ã¯ã»ã¹åŒãå®è¡ããããã«ãããã¿ã€ããã§ãŒã³ã¯äžèŠã«ãªããŸãããã
testNumberããããã£ã«å€
8ãå²ãåœãŠããã
MyObject1ã®ã€ã³ã¹ã¿ã³ã¹ã¯å€æŽãã
ãŠããŸããã
objectRefãªããžã§ã¯ãã«å€ãå²ãåœãŠããšããã®ãããã¿ã€ããã§ãŒã³å
ã®å¯Ÿå¿ããããããã£ãåçŽã«é衚瀺ã«ãªããŸãã
ECMAScript
ãå
éšå
Objectã®å
éšããããã£
[[prototype]]ãå®çŸ©ããŠããããšã«æ³šæããŠãã ããã ãã®ããããã£ã¯ã¹ã¯ãªããããçŽæ¥ã¢ã¯ã»ã¹ã§ããŸããããã¢ã¯ã»ã¹ããããã£åŒã解決ããããã«äœ¿çšãããå
éš
[[prototype]]ããããã£ã«ãã£ãŠåç
§ããããªããžã§ã¯ãã®ãã§ãŒã³ããããŸãã ãã®ãã§ãŒã³ã¯ããªããžã§ã¯ãã®ãããã¿ã€ããã§ãŒã³ã§ãã ãããªãã¯
ãããã¿ã€ãããããã£ã¯ãå
éš
[[prototype]]ããããã£ãšå
±ã«ãå€ã®å²ãåœãŠããããã¿ã€ãã®å®çŸ©ãããã³æäœã®ããã«ååšããŸãã èèã®ããã2ã€ã®ç¹æ§éã®é¢ä¿ã®è©³çްã¯ECMA 262ïŒç¬¬3çïŒã§èª¬æãããŠããããã®èª¬æã«ã¯å«ãŸããŠããŸããã
èå¥åã®åå解決ãå®è¡ã³ã³ããã¹ããããã³ã¹ã³ãŒããã§ãŒã³
å®è¡ã³ã³ããã¹ã
å®è¡ã³ã³ããã¹ãã¯ãECMAScriptå®è£
ïŒECMA 262第3çïŒã§äœ¿çšãããæœè±¡æŠå¿µã§ãECMAScriptå®è£
ã«å¿
èŠãªåäœã決å®ããŸãã 仿§ã«ã¯ã
å®è¡ã³ã³ããã¹ãã®å®è£
æ¹æ³ã«ã€ããŠã¯äœãèšèŒãããŠããŸãããã
å®è¡ã³ã³ããã¹ãã«ã¯ã仿§ã§å®çŸ©ãããæ§é ãåç
§ããé¢é£å±æ§ããããããéããããŠããŠããããããã£ãæã€ãªããžã§ã¯ããšããŠæ§æ³ïŒãŸãã¯å®è£
ïŒããããšãã§ããŸãã
ãã¹ãŠã®javascriptã³ãŒãã¯
ãå®è¡ã³ã³ããã¹ãã§å®è¡ãã
ãŸã ã ã°ããŒãã«ã³ãŒãïŒhtmlããŒãžãŸãã¯JSãã¡ã€ã«ã«åã蟌ãŸããã³ãŒãããŸãã¯ããŒãžã®ããŒãïŒããŒãïŒåŸã«å®è¡ãããã³ãŒãïŒã¯
ã°ããŒãã«å®è¡ã³ã³ããã¹ãã§
å®è¡ãããå颿°åŒã³åºãïŒããããã³ã³ã¹ãã©ã¯ã¿ãŒãšããŠïŒã«ã¯å¯Ÿå¿ããå®è¡ã³ã³ããã¹ãããããŸãã
eval颿°ã䜿çšããŠå®è¡ãããã³ãŒããç¹å®ã®å®è¡ã³ã³ããã¹ããååŸããŸããã
evalã¯javascriptããã°ã©ããŒã«ãã£ãŠäžè¬çã«äœ¿çšãããªããããããã§ã¯èª¬æããŸããã
å®è¡ã³ã³ããã¹ãã®æå®ããã詳现ã¯ãECMA 262ïŒç¬¬3çïŒã®ã»ã¯ã·ã§ã³10.2ã«ãããŸãã
javascript颿°ãåŒã³åºããããšã
å®è¡ã³ã³ããã¹ãã远å ãã
ãŸã ãå¥ã®é¢æ°ãåŒã³åºããããšïŒãŸãã¯åã颿°ãååž°çã«ïŒãæ°ãã
å®è¡ã³ã³ããã¹ããäœæãããå®è¡ããã»ã¹ã¯é¢æ°åŒã³åºãäžã«ãã®ã³ã³ããã¹ãã远å ããŸãã åŒã³åºããã颿°ãå®äºãããšãå
ã®
å®è¡ã³ã³ããã¹ããè¿ãããŸãã ãããã£ãŠãå®è¡ããJavaScriptã³ãŒãã¯ã
å®è¡ã³ã³ããã¹ãã®ã¹ã¿ãã¯ã圢æããŸãã
å®è¡ã³ã³ããã¹ããäœæããããšãç¹å®ã®é åºã§ããã€ãã®ããšãèµ·ãããŸãã æåã«ã
å®è¡ã®
ã³ã³ããã¹ãã§ ãActivationãªããžã§ã¯ããäœæãããŸãã ã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ãã¯ã仿§ã®å¥ã®ã¡ã«ããºã ã§ãã çµæãšããŠã¢ã¯ã»ã¹å¯èœãªååä»ãããããã£ãããããããªããžã§ã¯ããšèŠãªãããšãã§ããŸãããéåžžã®ãªããžã§ã¯ãã§ã¯ãããŸããã ãããã¿ã€ãããããŸããïŒå°ãªããšããããã¿ã€ãã¯å®çŸ©ãããŠããŸããïŒãjavascriptã³ãŒãã«ã¯ããªã³ã¯ããããŸããã
颿°ãåŒã³åºãããã®
å®è¡ã³ã³ããã¹ããäœæ
ããæ¬¡ã®ã¹ãããã¯ã
åŒæ°ãªããžã§ã¯ããäœæããããšã§ããããã¯ããã®é åºã§é¢æ°ã«éä¿¡ãããåŒæ°ã«å¯Ÿå¿ããæŽæ°ã§ã€ã³ããã¯ã¹ä»ããããèŠçŽ ãæã€é
åã®ãããªãªããžã§ã¯ãã§ãã ãŸããããããã£
lengthãš
calleeããããŸãïŒããã¯èª¬æã«é¢ä¿ãããŸããã詳现ã¯ä»æ§ã«ãããŸãïŒã ã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ãã®ããããã£ã¯ã
åŒæ°argumentsãžã®åç
§ãå²ãåœãŠããã
argumentsãšããååã§äœæãããŸãã
次ã«
ãå®è¡ã³ã³ããã¹ãã scopeãå²ãåœãŠ
ãŸã ã
ã¹ã³ãŒãã¯ããªããžã§ã¯ãã®ãªã¹ãïŒãŸãã¯ãã§ãŒã³ïŒã§æ§æãããŸãã å颿°ãªããžã§ã¯ãã«ã¯å
éš
[[scope]]ããããã£ãããïŒããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãïŒãããããªããžã§ã¯ãã®ãªã¹ãïŒãŸãã¯ãã§ãŒã³ïŒã§æ§æãããŠããŸãã 颿°åŒã³åºãã®
å®è¡ã³ã³ããã¹ãã«å²ãåœãŠããã
ã¹ã³ãŒãã¯ã察å¿ãã颿°ãªããžã§ã¯ãã®
[[scope]]ããããã£ã«ãã£ãŠåç
§ããããªã¹ããšããã§ãŒã³ã®æäžéšïŒãŸãã¯ãã®ãªã¹ãã®æäžéšïŒã«è¿œå ãããã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ãã§æ§æãããŸãã
次ã«ãECMA 262ã§å€æ°ã®ãªããžã§ã¯ãïŒå€æ°ãªããžã§ã¯ãïŒãšããŠå®çŸ©ãããŠãããªããžã§ã¯ãã䜿çšããŠã倿°ãäœæããããã»ã¹ïŒå€æ°ã®ã€ã³ã¹ã¿ã³ã¹åïŒãçºçããŸãã åæã«ãã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ãã¯å€æ°ã®ãªããžã§ã¯ããšããŠäœ¿çšãããŸãïŒããã¯åããªããžã§ã¯ãã§ãããããã¯éèŠã§ãïŒã 倿°ãªããžã§ã¯ãã®ååä»ãããããã£ã¯ã颿°ã®åä»®ãã©ã¡ãŒã¿ãŒã«å¯ŸããŠäœæããã颿°ãåŒã³åºããšãã®åŒæ°ããããã®ãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããå ŽåãåŒæ°ã¯ãããã®ããããã£ã«å²ãåœãŠãããŸãïŒããã§ãªãå Žåã¯
undefined ïŒã å
éšé¢æ°ã®å®çŸ©ã¯ã颿°å®£èšã§äœ¿çšããã颿°ã®ååã«å¯Ÿå¿ããååãæã€å€æ°ã®ãªããžã§ã¯ãããããã£ã«å²ãåœãŠããã颿°ãªããžã§ã¯ããäœæããããã«äœ¿çšãããŸãã 倿°ãäœæããæåŸã®æé ã¯ã颿°å
ã§å®çŸ©ããããã¹ãŠã®ããŒã«ã«å€æ°ã«å¯Ÿå¿ãã倿°ãªããžã§ã¯ãã®ååä»ãããããã£ãäœæããããšã§ãã
宣èšãããããŒã«ã«å€æ°ã«å¯Ÿå¿ãã倿°ãªããžã§ã¯ãã§äœæãããããããã£ã¯ã倿°ã®äœæäžã«æåã«
æªå®çŸ©ã®å€ãååŸããŸããããŒã«ã«å€æ°ã¯ã颿°æ¬äœã³ãŒãã®å®è¡äžã«å¯Ÿå¿ããå²ãåœãŠæäœãå®è¡ããããŸã§åæåãããŸããã
å®éã颿°ã®ããŒã«ã«å€æ°ã«å¯Ÿå¿ãã
argumentsããããã£ãæã€ã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ããšååä»ãããããã£ãæã€å€æ°ãªããžã§ã¯ãã¯ãèå¥åã®
åŒæ°ã颿°ã®ããŒã«ã«å€æ°ãšèŠãªãããšãã§ããåããªããžã§ã¯ãã§ãã
çµè«ãšããŠãthisããŒã¯ãŒãã§äœ¿çšãããå€ãå²ãåœãŠãããŸãã ãã®å€ããªããžã§ã¯ããåç
§ããå Žåã
ãã®æ¥é èŸãä»ããããããã£ã¢ã¯ã»ã¹åŒã¯ãã®ãªããžã§ã¯ãã®ããããã£ãåç
§ããŸãã ãã®å€ïŒé¢æ°å
ã§å²ãåœãŠãããïŒã
nullã®å Žåã
ããã¯ã°ããŒãã«ãªããžã§ã¯ããåç
§ããŸãã
ã°ããŒãã«å®è¡ã³ã³ããã¹ãã®åŠçã¯ãããã«ç°ãªããåŒæ°ããªããããåç
§ããã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ããå®çŸ©ããå¿
èŠã¯ãããŸããã ã°ããŒãã«å®è¡ã³ã³ããã¹ãã«ã¯ã¹ã³ãŒããå¿
èŠã§ããããã®ãã§ãŒã³ã«ã¯ã°ããŒãã«ãªããžã§ã¯ããšãã1ã€ã®ãªããžã§ã¯ãã®ã¿ãå«ãŸããŸãã ã°ããŒãã«å®è¡ã³ã³ããã¹ãã¯å€æ°ã®äœæãééãããã®å
éšé¢æ°ã¯éåžžã®ãããã¬ãã«ã®å®£èšé¢æ°ã§ãããã»ãšãã©ã®JavaScriptã³ãŒããæ§æããŸãã ã°ããŒãã«ãªããžã§ã¯ãã¯å€æ°ã®ãªããžã§ã¯ããšããŠäœ¿çšããããããã°ããŒãã«ã«å®£èšããã颿°ã¯ã°ããŒãã«ãªããžã§ã¯ãã®ããããã£ã«ãªããŸãã ã°ããŒãã«ã«å®£èšããã倿°ã«ã€ããŠãåãã§ãã
ã°ããŒãã«å®è¡ã³ã³ããã¹ãã¯ã
thisã®å€ãšããŠã°ããŒãã«ãªããžã§ã¯ããžã®åç
§ã䜿çšããŸãã
ã¹ã³ãŒããã§ãŒã³ãš[[scope]]ããããã£
颿°åŒã³åºãã®å®è¡ã³ã³ããã¹ã
ã®ã¹ã³ãŒããã§ãŒã³ã¯ã颿°ãªããžã§ã¯ãã®
[[scope]]ããããã£ã«å«ãŸãã
ã¹ã³ãŒããã§ãŒã³ã®å
é ã«ã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ãïŒå€æ°ãªããžã§ã¯ãïŒã远å ããããšã«ãã£ãŠçµã¿ç«ãŠãããŸãããããã£ãŠãå
éš
[[scope]]ããããã£ã®å®çŸ©æ¹æ³ãçè§£ããããšãéèŠã§ãã
ECMAScriptã§ã¯ã颿°ã¯ãªããžã§ã¯ãã§ããã颿°å®£èšãã倿°ãäœæãããšããåŒé¢æ°ïŒé¢æ°åŒïŒãå®è¡ãããšãããŸãã¯
Functionã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããããšãã«äœæãããŸãã
Functionã³ã³ã¹ãã©ã¯ã¿ãŒã«ãã£ãŠäœæããã颿°ãªããžã§ã¯ãã«ã¯ãåžžã«
[[scope]]ããããã£ããããŸããããã¯ãã°ããŒãã«ãªããžã§ã¯ãã®ã¿ãå«ã
ã¹ã³ãŒããã§ãŒã³ãåç
§ããŸãã
颿°å®£èšãŸãã¯é¢æ°åŒã«ãã£ãŠäœæããã颿°ãªããžã§ã¯ãã«ã¯
ãããããäœæãããå®è¡ã³ã³ããã¹ãã®
ã¹ã³ãŒãããããå
éš
[[scope]]ããããã£ã«å²ãåœãŠãããŸãã
次ã®ãããªã°ããŒãã«é¢æ°å®£èšã®æãåçŽãªå Žå
function exampleFunction(formalParameter){ ...
察å¿ãã颿°ãªããžã§ã¯ãã¯ãã°ããŒãã«å®è¡ã³ã³ããã¹ãã®å€æ°ã®äœæäžã«äœæãããŸãã ã°ããŒãã«å®è¡ã³ã³ããã¹ãã«ã¯ãã°ããŒãã«ãªããžã§ã¯ãã®ã¿ã§æ§æããã
ã¹ã³ãŒãããããŸãã
ãããã£ãŠãã°ããŒãã«ãªããžã§ã¯ã
exampleFunctionã®ããããã£ã«ãã£ãŠåç
§ããããã®äœæããã颿°ãªããžã§ã¯ãã«ã¯ãã°ããŒãã«ãªããžã§ã¯ãã®ã¿ãå«ã
ã¹ã³ãŒããã§ãŒã³ãåç
§ããå
éšããããã£
[[scope]]ãå²ãåœãŠãããŸãã
ã°ããŒãã«ã³ã³ããã¹ãã§ã®åŒé¢æ°ã®å®è¡äžã«ãåæ§ã®ã¹ã³ãŒããã§ãŒã³ãå²ãåœãŠãããŸãã
var exampleFuncRef = function(){ ...
ãã ãããã®å Žåãã°ããŒãã«ãªããžã§ã¯ãã®ååä»ãããããã£ã¯ãã°ããŒãã«å®è¡ã³ã³ããã¹ãã®å€æ°ã®äœæäžã«äœæãããŸããã颿°ãªããžã§ã¯ãã¯äœæããããå²ãåœãŠåŒãå®è¡ããããŸã§ãã°ããŒãã«ãªããžã§ã¯ãã®ååä»ãããããã£ã«ãã®åç
§ãå²ãåœãŠãããŸããã ãã ãã颿°ã®äœæã¯åŒãç¶ãã°ããŒãã«å®è¡ã³ã³ããã¹ãã§è¡ããããããäœæããã颿°ãªããžã§ã¯ãã®
[[scope]]ããããã£ã«ã¯ãå²ãåœãŠãããã¹ã³ãŒããã§ãŒã³ã®ã°ããŒãã«ãªããžã§ã¯ãã®ã¿ãå«ãŸããŸãã
颿°ãšåŒé¢æ°ã®å
éšå®£èšã«ããã颿°å®è¡ã®ã³ã³ããã¹ãå
ã§äœæããã颿°ãªããžã§ã¯ããäœæããããã
ãã¹ã³ãŒãã®ããè€éãª
ãã§ãŒã³ãååŸãã
ãŸã ã å
éšé¢æ°ã®å®£èšã§é¢æ°ãå®çŸ©ããå€éšé¢æ°ãå®è¡ãã以äžã®ã³ãŒããæ€èšããŠãã ãã
function exampleOuterFunction(formalParameter){ function exampleInnerFuncitonDec(){ ...
å€éšé¢æ°ã®å®£èšã«å¯Ÿå¿ãã颿°ãªããžã§ã¯ãã¯ãã°ããŒãã«å®è¡ã³ã³ããã¹ãã§ã®å€æ°ã®äœæäžã«äœæãããããããã®
[[scope]]ããããã£ã«ã¯ã1ã€ã®ã°ããŒãã«ãªããžã§ã¯ãã§æ§æããã
ã¹ã³ãŒã ãã§ãŒã³ãå«ãŸããŸãã
ã°ããŒãã«ã³ãŒãã
exampleOuterFunctionåŒã³åºããè¡ããšãã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ãïŒå€æ°ãªããžã§ã¯ãïŒãšãšãã«ããã®é¢æ°åŒã³åºãã®æ°ããå®è¡ã³ã³ããã¹ããäœæãããŸãã æ°ããå®è¡ã³ã³ããã¹ã
ã®ã¹ã³ãŒãã¯ãæ°ããã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ããšãããã«ç¶ãå€éšé¢æ°ã®
[[scope]]ããããã£ãåç
§ãããã§ãŒã³ïŒã°ããŒãã«ãªããžã§ã¯ãã®ã¿ïŒã§æ§æããããã§ãŒã³ã«ãªããŸãã æ°ããå®è¡ã³ã³ããã¹ãã®å€æ°ãäœæããããã»ã¹ã«ãããå
éšé¢æ°ã®å®£èšã«å¯Ÿå¿ãã颿°ãªããžã§ã¯ããäœæãããŸãããã®å
éšé¢æ°ã®
[[scope]]ããããã£ã«ã¯ãäœæãããå®è¡ã³ã³ããã¹ãã®
ã¹ã³ãŒãã®å€ãå²ãåœãŠãããŸãã
ã¹ã³ãŒããã§ãŒã³ã«ã¯ãã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ããšããã«ç¶ãã°ããŒãã«ãªããžã§ã¯ããå«ãŸããŸãã
ãã®æç¹ãŸã§ããã¹ãŠã¯ãœãŒã¹ã³ãŒãã®æ§é ãšå®è¡ã«ãã£ãŠèªåçã«å®è¡ããã³å¶åŸ¡ãããŸãã å®è¡ã³ã³ããã¹ã
ã®ã¹ã³ãŒãã®ãã§ãŒã³ã¯ ãäœæããã颿°ãªããžã§ã¯ãã®
[[scope]]ããããã£ãå®çŸ©ãã
[[scope]]颿°ãªããžã§ã¯ãã®ãããã®ããããã£ã¯ïŒå¯Ÿå¿ããã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ããšå
±ã«ïŒå®è¡ã³ã³ããã¹ãã®ã¹ã³ãŒããæ±ºå®ããŸãã ãã ããECMAScriptã¯ãã¹ã³ãŒãã倿Žããææ®µãšããŠ
withã¹ããŒãã¡ã³ãããµããŒãã
ãŠããŸãã
withã¹ããŒãã¡ã³ãã¯åŒãè©äŸ¡ããããããªããžã§ã¯ãã§ããå Žå
ãçŸåšã®å®è¡ã³ã³ããã¹ãã®
ã¹ã³ãŒãã«è¿œå ãããŸãïŒã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ã/倿°ã®çŽåïŒã 次ã«
ãwithã¯å¥ã®åŒïŒãããã¯ã®å ŽåãããïŒ
ãè©äŸ¡ã
ãå®è¡ã³ã³ããã¹ãã®
ã¹ã³ãŒããã§ãŒã³ãå
ã®åœ¢åŒã«åŸ©å
ããŸã ã
颿°ãªããžã§ã¯ãã®äœæã¯å€æ°ã®äœæäžã«è¡ãããããã
withã¹ããŒãã¡ã³ãã¯é¢æ°ã®å®£èšã«åœ±é¿ããŸããããåŒé¢æ°ã¯
withã¹ããŒãã¡ã³ãå
ã§å®è¡ã§ããŸã
var y = {x:5};
exampleFuncWithã
åŒã³åºããããš ããã®å®è¡ã³ã³ããã¹ãã«ã¯
ããã®é¢æ°ã®ã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ããšæ¬¡ã®ã°ããŒãã«ãªããžã§ã¯ãã§æ§æããã
ã¹ã³ãŒããã§ãŒã³ããããŸãã
withã¹ããŒãã¡ã³ããå®è¡ãã
ãš ããã®åŒé¢æ°ã®å®è¡äžãã°ããŒãã«å€æ°
yã«ãã£ãŠåç
§ããããªããžã§ã¯ãããã®
ã¹ã³ãŒããã§ãŒã³ã®å
é ã«è¿œå ãããŸãã
åŒé¢æ°ã®å®è¡ã«ãã£ãŠäœæããã[[scope]]颿°ãªããžã§ã¯ãã®ããããã£ã«ã¯ããã®ãªããžã§ã¯ããäœæãããå®è¡ã³ã³ããã¹ãã®ã¹ã³ãŒãã«å¯Ÿå¿ããå€ãå²ãåœãŠãããŸããã¹ã³ãŒãã¯ããªããžã§ã¯ãyãšãããã«ç¶ãå€éšé¢æ°ã®å®è¡ã®ã³ã³ããã¹ãããã®ã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ããã°ããŒãã«ãªããžã§ã¯ãããæ§æãããŸããwithã¹ããŒãã¡ã³ãã®blockã¹ããŒãã¡ã³ããå®äºãããšãå®è¡ã³ã³ããã¹ãã®ã¹ã³ãŒãã埩å
ãããŸãïŒyãªããžã§ã¯ãã¯åé€ãããŸãïŒãããã®æç¹ã§é¢æ°ãªããžã§ã¯ããäœæããããã®[[scope]]ããããã£ã«ã¹ã³ãŒããã§ãŒã³ãžã®ãªã³ã¯ãå²ãåœãŠãããŸãããªããžã§ã¯ãyãäžéšã«ãããŸããèå¥åã®åå解決
èå¥åã¯ãã¹ã³ãŒãã®ãã§ãŒã³ãéããŠæ€çŽ¢ãããŸããECMA 262ã¯ããããèå¥åã§ã¯ãªãããŒã¯ãŒããšããŠå®çŸ©ããŸãããããã¯äžåçã§ã¯ãããŸãããã¹ã³ãŒãã®ãã§ãŒã³ã«é Œãããšãªããããã䜿çšãããå®è¡ã®ã³ã³ããã¹ãã«ããthisã®å€ã«å¿ããŠæ±ºå®ãããŸããèå¥åå解決ã¯ãã¹ã³ãŒããã§ãŒã³ã®æåã®ãªããžã§ã¯ãããå§ãŸããŸããããã»ã¹ã¯ãèå¥åã«å¯Ÿå¿ããååã®ããããã£ããããã©ããã確èªããŸããäºå®ã®ããã®ã¹ã³ãŒãã®é£éãªããžã§ã¯ãã®ãã§ãŒã³ã§ããå Žåããã®ãã¹ãã¯ãã®ãªããžã§ã¯ãã®ãããã¿ã€ãã®ãã§ãŒã³ïŒååšããå ŽåïŒãã«ããŒããŸãã察å¿ããå€ãã¹ã³ãŒããã§ãŒã³ã®æåã®ãªããžã§ã¯ãã§èŠã€ãããªãå Žåãæ€çŽ¢ã¯æ¬¡ã®ãªããžã§ã¯ãã§ç¶è¡ãããŸãããããŠãèå¥åã«å¯Ÿå¿ããååãæã€ããããã£ããã§ãŒã³ã®ãªããžã§ã¯ãã®1ã€ïŒãŸãã¯ãã®ãããã¿ã€ãã®1ã€ïŒã§èŠã€ãããŸã§ããŸãã¯å¯èŠé åã®ãã§ãŒã³ãçµäºãããŸã§ç¶ããŸããèå¥åã«å¯Ÿããæäœã¯ãåè¿°ã®ããã«ããªããžã§ã¯ãã®ããããã£ã«ã¢ã¯ã»ã¹ããããã®åŒã䜿çšãããã®ãšåãæ¹æ³ã§çºçããŸããã¹ã³ãŒããã§ãŒã³ã§èå¥ããããªããžã§ã¯ã察å¿ããããããã£ãæã€ããã«ãããããã£ãžã®ã¢ã¯ã»ã¹ã®åŒã§ãªããžã§ã¯ãã®å Žæãåããèå¥åã¯ãã®ãªããžã§ã¯ãã®ããããã£ã®ååãšããŠæ©èœããŸããã°ããŒãã«ãªããžã§ã¯ãã¯åžžã«ã¹ã³ãŒããã§ãŒã³ã®æåŸã«ãããŸãã颿°åŒã³åºãã®å®è¡ã³ã³ããã¹ãã«ã¯ãã§ãŒã³ã®å
é ã«ã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ãïŒå€æ°ãªããžã§ã¯ãïŒãå«ãŸããŠããããã颿°æ¬äœã§äœ¿çšãããèå¥åã¯ãæåã«ããããæ£åŒãªãã©ã¡ãŒã¿ãŒãå
éšé¢æ°å®£èšã®ååããŸãã¯ããŒã«ã«å€æ°ã«å¯Ÿå¿ãããã©ããã確èªããŸãããããã¯ãã¢ã¯ãã£ããŒã·ã§ã³ãªããžã§ã¯ãïŒå€æ°ãªããžã§ã¯ãïŒã®ååä»ãããããã£ãšããŠèšç®ãããŸãã翻蚳ã«ã¯ãªã¥ããã©ã»ãªãããããå«ãŸããŠããŸãããJavaScriptã®ã¯ããŒãžã£ãŒ[ããŒã2]