ãã®èšäºã§ã¯ãã¯ã©ã€ã¢ã³ãåŽJavaScriptã®äžè¬çãªã¿ã€ãã®ã¡ã¢ãªãªãŒã¯ã«ã€ããŠèª¬æããŸãã ãŸããChromeéçºããŒã«ã䜿çšããŠããããæ€åºããæ¹æ³ãåŠã³ãŸãã

翻蚳è
ã®ã¡ã¢ïŒãã®èšäºã®æåã®éšåã¯ã翻蚳è
ã®ã¡ã¢ã§ãã£ã±ãã§ãã ææã®åæäžã«ãããã€ãã®ãã€ã³ããåå¥ã«æç¢ºã«ããå¿
èŠãããããšãæããã«ãªããŸããã
ãšã³ããªãŒ
ã¡ã¢ãªãªãŒã¯ã¯ãé
ããæ©ãããã¹ãŠã®éçºè
ãçŽé¢ããçš®é¡ã®ã¿ã¹ã¯ã«å±ããŸãã èªåã¡ã¢ãªç®¡çãåããèšèªã§ã¯ããã¹ãŠã®åé¡ãäžåºŠã«è§£æ±ºã§ããããã§ã¯ãããŸãã-ã¡ã¢ãªãªãŒã¯ãçºçããç¶æ³ã¯ãŸã ãããŸãã ãªãŒã¯ã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®é
å»¶ãããªãŒãºãä»ã®ã¢ããªã±ãŒã·ã§ã³ã®åé¡ãªã©ãããŸããŸãªåé¡ãåŒãèµ·ãããŸãã
ã¡ã¢ãªãªãŒã¯ãšã¯äœã§ããïŒ
ã¡ã¢ãªãªãŒã¯ãšã¯ãã¢ããªã±ãŒã·ã§ã³ã§äžèŠã«ãªã£ãã¡ã¢ãªã§ãããäœããã®çç±ã§ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãŸãã¯äœ¿çšå¯èœãªã¡ã¢ãªã®ããŒã«ã«è¿ãããŸããïŒ ç¿»èš³è
ã®ã¡ã¢ïŒ ããŒãå
ïŒã ããã°ã©ãã³ã°èšèªã¯ãã¡ã¢ãªãªãŒã¯ã®ãªã¹ã¯ãæžããããŸããŸãªã¢ãããŒãã䜿çšããŸãããç¹å®ã®ã¡ã¢ãªãå¿
èŠãã©ãããšããã¿ã¹ã¯ã¯ã ã¢ã«ãŽãªãºã çã«è§£æ±ºã§ããŸããïŒ ç¿»èš³è
ã®ã¡ã¢ïŒ 忢åé¡ã«èŠçŽãããŸã ïŒã ã€ãŸããç¹å®ã®ã¡ã¢ãªããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«è¿ãããšãã§ãããã©ããã倿ã§ããã®ã¯éçºè
ã ãã§ãã ããã°ã©ãã³ã°èšèªã®ã¡ã¢ãªç®¡çã¯ãæåãšèªåã«åããããŸãã æåã®ã¿ã€ãã¯ãã¡ã¢ãªãšçŽæ¥å¯Ÿè©±ããã®ã«åœ¹ç«ã€ããŒã«ã®ã»ãããéçºè
ã«æäŸããŸãã 2çªç®ã«ã¯ããã¬ããŒãžã³ã¬ã¯ã¿ãŒããšåŒã°ããç¹å¥ãªããã»ã¹ããããèªåçã«åŒã³åºãããŠã¡ã¢ãªãåé€ããŸãã
翻蚳è
泚ïŒããã«ã€ããŠã¯ããŠã£ãããã£ã¢ã§è©³ãã説æããŠããŸãïŒ ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ ã æåã¡ã¢ãªç®¡ç ã ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ ã
JavaScriptã¡ã¢ãªç®¡ç
JavaScriptã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒãçµã¿èŸŒãŸããããã°ã©ãã³ã°èšèªã§ãã ã³ã¬ã¯ã¿ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã«å²ãåœãŠãããã¡ã¢ãªãã©ã°ã¡ã³ãã®ãã¡ããã®ã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåãããå°éå¯èœããªãã®ã宿çã«ãã§ãã¯ããŸãã ã€ãŸããã¬ããŒãžã³ã¬ã¯ã¿ã¯ããã©ã®ãããªã¡ã¢ãªããŸã å¿
èŠã§ããïŒããšãã質åããã©ã®ãããªã¡ã¢ãªã«ã¢ã¯ã»ã¹ã§ããŸããïŒããšãã質åã«å€æããŸãã éãã¯åãã«è¶³ããªãããã«èŠããŸãããããã§ã¯ãããŸããïŒå²ãåœãŠãããã¡ã¢ãªã®ãã©ã°ã¡ã³ããå°æ¥å¿
èŠã«ãªããã©ããã¯éçºè
ã ããç¥ã£ãŠããŸãããå°éäžèœã¡ã¢ãªã¯ã¢ã«ãŽãªãºã ã§èšç®ãããOSã«è¿ãããããã«ããŒã¯ãããŸãã
ã¬ããŒãžã³ã¬ã¯ã¿ãæããªãèšèªã¯ãããŸããŸãªååã«åºã¥ããŠæ©èœããŸãã ããšãã°ãæç€ºçãªã¡ã¢ãªç®¡çããããŸããéçºè
ã¯ããã®ã¡ã¢ãªã®äžéšãåé€ã§ããããšãã³ã³ãã€ã©ã«çŽæ¥äŒããŸãã ãªã³ã¯ãã«ãŠã³ãããã¢ã«ãŽãªãºã ããããŸãããã®ã¢ã«ãŽãªãºã ã§ã¯ã䜿çšåæ°ãåã¡ã¢ãªãããã¯ã«é¢é£ä»ããããŠããŸãïŒãªã»ããããããšããããã¯ãOSã«è¿ãããŸãïŒã ãããã®ææ³ã«ã¯é·æãšçæããããã¡ã¢ãªãªãŒã¯ãåŒãèµ·ããå¯èœæ§ããããŸãã
翻蚳è
泚ïŒãªã³ã¯ã«ãŠã³ãã¢ã«ãŽãªãºã ã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã§ã䜿çšãããŸãã ããã«ããã®ã¢ã«ãŽãªãºã ã®åºæ¬çãªåœ¢åŒã§ã®æäœã«ãããæªäœ¿çšã®ãªããžã§ã¯ããçžäºã«åç
§ããããçžäºã«åé€ããããã¯ãã埪ç°ãªã³ã¯ãçºçããå¯èœæ§ãããããšã«æ³šæããŠãã ããã 詳现ã«ã€ããŠã¯ããŠã£ãããã£ã¢ãã芧ãã ãã ã
JavaScriptã®ã¡ã¢ãªãªãŒã¯
ã¬ããŒãžã³ã¬ã¯ã¿ãŒèšèªã§ã®ã¡ã¢ãªãªãŒã¯ã®äž»ãªåå ã¯ã äžèŠãªãªã³ã¯ã§ãã ãããäœã§ããããçè§£ããããã«ããŸããã¬ããŒãžã³ã¬ã¯ã¿ãŒããªããžã§ã¯ãã®å°éå¯èœæ§ããã§ãã¯ããæ¹æ³ãæ£ç¢ºã«èŠãŠã¿ãŸãããã
ããŒãã³ã°ã¢ã«ãŽãªãºã ïŒããŒã¯ã¢ã³ãã¹ã€ãŒãïŒ
ã»ãšãã©ã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ã ããŒã¯ã¢ã³ãã¹ã€ãŒãã¢ã«ãŽãªãºã ã䜿çšããŸãã
ã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ããã«ãŒããªããžã§ã¯ãããŸãã¯ãã«ãŒããã®ãªã¹ããäœæããŸãã ååãšããŠããããã¯ã³ãŒãã§å®£èšãããã°ããŒãã«å€æ°ã«ãªããŸãã JavaScriptã§ã¯ãå
žåçãªã«ãŒãã¯window
ãªããžã§ã¯ãã§ãã window
ã¯ããŒãžå
šäœã«ååšãããããã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ããã®ãªããžã§ã¯ããšãã®åå«ãåžžã«ããã°ã©ã ã©ã³ã¿ã€ã ã«ååšããããšãçè§£ããŸãïŒã€ãŸããã¬ããŒãžã«ãªããŸããïŒã
ã³ã¬ã¯ã¿ãŒã¯ãã«ãŒããšãã®åå«ãååž°çã«èµ°æ»ããããããã¢ã¯ãã£ãã«ããŸãïŒã€ãŸããã¬ããŒãžã§ã¯ãããŸããïŒã ã«ãŒãããå°éã§ãããã®ã¯ãã¹ãŠãŽããšã¯èŠãªãããŸããã
- 2çªç®ã®æé ã®åŸãã¢ã¯ãã£ããšããŠããŒã¯ãããŠããªãã¡ã¢ãªãã©ã°ã¡ã³ãã¯ãã¬ããŒãžãšèŠãªãããšãã§ããŸãã ããã§ãã³ã¬ã¯ã¿ãŒã¯ãã®ã¡ã¢ãªãè§£æŸããŠOSã«è¿ãããšãã§ããŸãã
ææ°ã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãã®ã¢ã«ãŽãªãºã ãæ¹åããŸããããã®æ¬è³ªã¯åãã§ããéæå¯èœãªã¡ã¢ãªãããŒã¯ããæ®ããã¬ããŒãžãšããŠå®£èšããŸãã ããã§ã äžèŠãªãªã³ã¯ãå®çŸ©ã§ããŸãããããã¯ãã«ãŒãããå°éå¯èœãªãªã³ã¯ã§ããã絶察ã«äºåºŠãšå¿
èŠãšãããªãã¡ã¢ãªã®æçãæããŸãã JavaScriptã§ã¯ã äžèŠãªãªã³ã¯ã¯ã³ãŒãã§å¿ããããå€ã倿°ã«ãªããããå€ãã®äžèŠãªãªããžã§ã¯ããã¡ã¢ãªã«ä¿æããŸãã ãšããã§ãäžéšã®äººã
ã¯ããããã¯èšèªã§ã¯ãªãéçºè
ã®ééãã ãšèããŠããŸãã
ãã®ãããJavaScriptã®ã¡ã¢ãªãªãŒã¯ã®åå ãç¹å®ããã«ã¯ã äžèŠãªãªã³ã¯ã«ã€ãªããç¶æ³ãçè§£ããå¿
èŠããããŸã ã
翻蚳è
ã®ã¡ã¢ïŒããã«èªãåã«ã ã¡ã¢ãªç®¡çã«é¢ããMDNã®èšäºãã芧ã«ãªãããšããå§ãããŸãã
JavaScriptã§æãäžè¬çãª4ã€ã®ã¿ã€ãã®ã¡ã¢ãªãªãŒã¯
翻蚳è
泚ïŒä»¥äžã®äŸã§ã¯ãã¯ã©ã€ã¢ã³ãåŽã®JavaScriptãæ€èšããŸãã äžå¿
èŠãªèª¬æãäºçŽãªãã«ãã°ããŒãã«window
ãªããžã§ã¯ããããããšãèæ
®ããŸãã å¥ã®å®è¡ç°å¢ã«ã¯JavaScript window
ããªãå ŽåããããŸããããã®èšäºã§èª¬æãããªãŒã¯ã®åå ã¯é¢é£ããŠããŸãã
1ïŒã©ã³ãã ã°ããŒãã«å€æ°
JavaScriptã®éçºã«ãããç®æšã®1ã€ã¯ãJavaã«äŒŒãèšèªãäœæããããšã§ããããåå¿è
ã§ã䜿çšã§ããã»ã©å³å¯ã§ã¯ãããŸããã ãã®èšèªã®åŒ±ç¹ã®1ã€ã¯ã宣èšãããŠããªã倿°ã®åŠçã§ãããã®ãããªå€æ°ã«ã¢ã¯ã»ã¹ãããšã ã°ããŒãã«ãªããžã§ã¯ãã«æ°ãã倿°ãäœæãããŸãã ãããã£ãŠãã³ãŒããæ€èšããå ŽåïŒ
function foo(arg) { bar = " "; }
å®éã«ã¯ã次ã®ããšãæå³ããŸãã
function foo(arg) { window.bar = " "; }
颿°foo
ã¹ã³ãŒãå
ã§ã®ã¿å€æ°ãžã®ãªã³ã¯ãbar
å«ããããã宣èšã§var
ãæå®ããã®ãå¿ãããšãã°ããŒãã«å€æ°ãäœæãããŸãã ãã®å ŽåãåçŽãªæååã«ãã£ãŠã¡ã¢ãªãªãŒã¯ãçºçããŸãã ããã»ã©å®³ã¯ãããŸãããããã¡ãããç¶æ³ã¯ããã«æªåããå¯èœæ§ããããŸãã
ã©ã³ãã ãªã°ããŒãã«å€æ°ãäœæããå¥ã®æ¹æ³ã¯ã this
ã䜿çšããthis
ã§ãïŒ
function foo() { this.variable = "potential accidental global"; }
ãã®ãããªãšã©ãŒãåé¿ããã«ã¯ã 'use strict'
远å ããŸãã JavaScriptãã¡ã€ã«ã®å
é ãžã ããã¯ãã©ã³ãã ãªã°ããŒãã«å€æ°ã®çºçãé²ãJavaScriptã®å³å¯ãªè§£æã¢ãŒããå«ããã£ã¬ã¯ãã£ãã§ãã
ã°ããŒãã«å€æ°ã«é¢ããæ³šæ
ã©ã³ãã ã«ã€ããŠã§ã¯ãªããæç€ºçã«å®£èšãããã°ããŒãã«å€æ°ã«ã€ããŠèª¬æããŸãã å®çŸ©äžãããããnull
ãšåçã«ãããåå²ãåœãŠããªãéããã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠåŠçãããŸããã ç¹ã«ãããã¯äžæçãªã¹ãã¬ãŒãžãšå€§ããªããŒã¿ãããã¯ã®åŠçã«äœ¿çšãããã°ããŒãã«å€æ°ã«é©çšãããŸãã 倧éã®æ
å ±ãæžã蟌ãããã«ã°ããŒãã«å€æ°ãå¿
èŠãªå Žåã¯ãããŒã¿ã®æäœã®æåŸã«ãã®å€ãnull
ã«èšå®ããããåå®çŸ©ãããããšã確èªããŠãã ããã
ã°ããŒãã«å€æ°ã«é¢é£ããã¡ã¢ãªäœ¿çšéã®å¢å ã®äŸã¯ã ãã£ãã·ã¥ -åå©çšå¯èœãªããŒã¿ãä¿åãããªããžã§ã¯ãã§ãã 广çãªéçšã®ããã«ã¯ããµã€ãºãå¶éããå¿
èŠããããŸãã ãã£ãã·ã¥ãå¶éãªãã§å€§ãããªããšãã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠãã£ãã·ã¥ã®å
容ãã¯ãªã¢ã§ããªããããã¡ã¢ãªã倧éã«æ¶è²»ãããå¯èœæ§ããããŸãã
2ïŒå¿ããããã¿ã€ããŒãšã³ãŒã«ããã¯
å€ãã®å Žåã setInterval
颿°ã®åæ§ã®äœ¿çšæ³ãããsetInterval
ã
var someResource = getData(); setInterval(function() { var node = document.getElementById('Node'); if(node) {
ãã®äŸã¯ããããã¿ã€ããŒãã©ã®ããã«æå®³ã§ãããã瀺ããŠããŸãïŒå€ãããŒããŸãã¯ããŒã¿ãžã®ã¢ã¯ã»ã¹ïŒã ããŒããåé€ãããšããã³ãã©ãŒé¢æ°å
ã®ãããã¯å
šäœãäžèŠã«ãªããŸãã ãã ãã setInterval
ã¢ã¯ãã£ãã§ããéãããã³ãã©ãŒãã¢ã¯ãã£ãã§ãããã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠã¯ãªã¢ã§ããŸããïŒãã®ãããæåã«ã€ã³ã¿ãŒãã«ã忢ããå¿
èŠããããŸãïŒã ãã®ããããã®äŸåé¢ä¿ãã¡ã¢ãªããåé€ã§ããŸããã ãããã倧éã®ããŒã¿ãæ ŒçŽããsomeResource
ã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠã¯ãªã¢ã§ããªãããšãsomeResource
ãŸãã
ã³ãŒã«ããã¯ã«ã€ããŠè©±ããŸãã ã»ãšãã©ã®å Žåãã€ãã³ããã³ãã©ãŒããã³ãµãŒãããŒãã£ã©ã€ãã©ãªã§äœ¿çšãããŸãã ã©ã€ãã©ãªã¯éåžžãã³ãŒã«ããã¯ãåŠçããç¬èªã®ã€ãã³ããã³ãã©ãŒããã³ãã®ä»ã®ãµããŒãããŒã«ãäœæããŸãã éåžžããªããžã§ã¯ããå°éäžèœã«ãªã£ãåŸã«å€éšãã³ãã©ãŒãåé€ããæ¹æ³ãæäŸããŸãã
次ã«ãã€ãã³ããã³ãã©ãŒã®ç¶æ³ãæ€èšããŸãã ãã³ãã©ãŒã¯ãäžèŠã«ãªã£ãå ŽåããŸãã¯é¢é£ä»ãããããªããžã§ã¯ãã䜿çšã§ããªããªã£ãå Žåã«åé€ããå¿
èŠããããŸãã ããã¯ãäžéšã®ãã©ãŠã¶ïŒInternet Explorer 6ïŒã埪ç°ãªã³ã¯ãæ£ããåŠçããæ¹æ³ãç¥ããªãã£ããããéå»ã«éèŠã§ããïŒäžèšã®æ³šãåç
§ïŒã ææ°ã®ãã©ãŠã¶ã®ã»ãšãã©ã¯ããªããžã§ã¯ãã«å°éã§ããªããªããšããã«ã€ãã³ããã³ãã©ãŒãåé€ããŸãã ãã ãããªããžã§ã¯ãèªäœãåé€ããåã«ãã€ãã³ããã³ãã©ãŒãæç€ºçã«åé€ããã®ãããã¯ã奜ã¿ã®ã«ãŒã«ã§ãã äŸïŒ
var element = document.getElementById('button'); function onClick(event) { element.innerHtml = 'text'; } element.addEventListener('click', onClick);
ã€ãã³ããã³ãã©ãŒãšåŸªç°åç
§ã«é¢ããæ³šæ
JavaScriptã®éçºè
ã¯ãã€ãã³ããã³ãã©ãŒãšåŸªç°åç
§ãé·ãéåé¡ãšèŠãªããŠããŸããã ããã¯ãInternet Explorerã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒã®ãã°ïŒãŸãã¯èšèšäžã®æ±ºå®ïŒã«ãããã®ã§ãã Internet Explorerã®å€ãããŒãžã§ã³ã§ã¯ãDOMèŠçŽ ãšJavaScriptã³ãŒãéã®åŸªç°ãªã³ã¯ãæ€åºã§ããŸããã§ããã ããã«å ããŠãéåžžãã€ãã³ããã³ãã©ã«ã¯ã€ãã³ããªããžã§ã¯ããžã®åç
§ãå«ãŸããŸãïŒäžèšã®äŸã®ããã«ïŒã ããã¯ãInternet Explorerã®ãªã¹ããŒãDOMããŒãã«è¿œå ããããã³ã«ãã¡ã¢ãªãªãŒã¯ãçºçããããšãæå³ããŸãã ãã®ãããWebéçºè
ã¯ãDOMããŒããåé€ããåã«ã€ãã³ããã³ãã©ãŒãæç€ºçã«åé€ãããããã³ãã©ãŒå
ã®ãªã³ã¯ãç¡å¹ã«ãå§ããŸããã ææ°ã®ãã©ãŠã¶ïŒInternet Explorerããã³Microsoft Edgeãå«ãïŒã¯ã埪ç°ãªã³ã¯ãèŠã€ããŠæ£ããåŠçããã¢ã«ãŽãªãºã ã䜿çšããŸãã ããã§ãããŒããåé€ããåã«removeEventListener
ãåŒã³åºãå¿
èŠãremoveEventListener
ã
jQueryãªã©ã®ãã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãªã¯ãã©ã€ãã©ãªAPIã䜿çšããŠäœæãããå ŽåãããŒãèªäœãåé€ããåã«ãã³ãã©ãŒãåé€ããŸãã ããã¯ã©ã€ãã©ãªèªäœã«ãã£ãŠè¡ãããå€ãInternet Explorerã®ãããªåé¡ã®ãããã©ãŠã¶ã§äœæ¥ããŠããå Žåã§ãããªãŒã¯ããªãããšãä¿èšŒããŸãã
3ïŒDOMããåé€ãããèŠçŽ ãžã®ãªã³ã¯
ããŒã¿æ§é å
ã«DOMããŒããä¿åãããšäŸ¿å©ãªå ŽåããããŸãã ããŒãã«å
ã®è€æ°ã®è¡ã®å
容ããã€ã³ãããšã«æŽæ°ãããšããŸãã èŸæžãŸãã¯é
åã«åDOMã·ãªãŒãºãžã®ãªã³ã¯ãä¿åããããšã¯çã«ããªã£ãŠããŸãã ãã®å Žåã2ã€ã®ãªã³ã¯ã¯åãDOMèŠçŽ ãæããŸãã1ã€ã¯DOMããªãŒã«ããããã1ã€ã¯èŸæžã«ãããŸãã å°æ¥ãããã®è¡ãåé€ããããšã«ããå Žåã¯ãäž¡æ¹ã®ãªã³ã¯ãå°éäžèœã«ããå¿
èŠããããŸãã
var elements = { button: document.getElementById('button'), image: document.getElementById('image'), text: document.getElementById('text') }; function doStuff() { elements.image.src = 'http://some.url/image'; elements.button.click(); console.log(elements.text.innerHTML);
ããã«å ããŠãDOMããªãŒã®å
éšããŒããžã®ãªã³ã¯ã§äœãããå¿
èŠããããŸãã ïŒ <td>
ïŒããŒãã«å
ã®ç¹å®ã®ã»ã«ãžã®ãªã³ã¯ãã³ãŒãã«ä¿åãããšããŸãã å°æ¥ãDOMããããŒãã«ãåé€ããããšã«ããŸãããããã®ã»ã«ãžã®ãªã³ã¯ã¯ä¿æããŸãã çŽæçã«ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãã®ã»ã«ä»¥å€ã®ãã¹ãŠãã¯ãªã¢ããããšãæåŸ
ããŠããŸãã ãã ããå®éã«ã¯ç°ãªããŸããã»ã«ã¯ããŒãã«ã®åå«ããŒãã§ããããã芪ãžã®ãªã³ã¯ãæ ŒçŽãããŸãã ããŒãã«ã»ã«ãžã®ãªã³ã¯ã¯ãããŒãã«å
šäœãã¡ã¢ãªã«ä¿åããããšã匷å¶ããŸãã DOMèŠçŽ ãžã®ãªã³ã¯ãä¿åãããšãã¯ããã®ããšã«çæããŠãã ããã
4ïŒç絡
JavaScriptã¯ã¯ããŒãžã£ãŒã®åºæ¬ã§ãã芪ã¹ã³ãŒããã倿°ãååŸãã颿°ã§ãã Meteoréçºè
ã¯ãJavaScriptã©ã³ã¿ã€ã ã®å®è£
ã®ç¹æ§ã«ãããåæ§ã®ããªãããŒãªæ¹æ³ã§ã¡ã¢ãªãªãŒã¯ãäœæã§ããç¶æ³ãçºèŠããŸãã ã
var theThing = null; var replaceThing = function () { var originalThing = theThing; var unused = function () { if (originalThing) console.log("hi"); }; theThing = { longStr: new Array(1000000).join('*'), someMethod: function () { console.log(someMessage); } }; }; setInterval(replaceThing, 1000);
ãã®äŸã§ã¯ã theThing
ãreplaceThing
ãã³ã«ã theThing
ã¯å€§ããªæååãšæ°ããã¯ããŒãžã£ãŒïŒ someMethod
ïŒãå«ãæ°ãããªããžã§ã¯ããååŸããŸãã ãã®å Žåã unused
倿°ã«ã¯ã originalThing
ïŒä»¥åã®replaceThing
åŒã³åºãã®replaceThing
ïŒãåç
§ããã¯ããŒãžã£ãŒãå«ãŸããŠããŸãã æ¢ã«äœãæ¥ããããã§ãããïŒ
ã¹ã³ãŒãã¯ãŸã åã芪ã¹ã³ãŒãã«ããã¯ããŒãžã£ãŒã«å¯ŸããŠäœæãããããããã®ã¹ã³ãŒãã¯å
±æãããããšã«æ³šæããããšãéèŠã§ãã ãã®å Žåã someMethod
ã®ã¯ããŒãºã®ããã«äœæãããã¹ã³ãŒãã¯ã someMethod
ãšå
±æãããŸãã unused
ã¯originalThing
ãžã®ãªã³ã¯ãä¿åããŸãã unused
ããã³æªäœ¿çšã§ããã someMethod
ã¯someMethod
ã§äœ¿çšã§ããŸãã someMethod
ã¯ã¹ã³ãŒããunused
ãšå
±æããããã unused
䜿çšãããªãå Žåã§ãoriginalThing
ãåŒã³åºããšãåžžã«ã¢ã¯ãã£ãã®ãŸãŸã«ãªããŸãïŒã€ãŸããã¬ããŒãžã³ã¬ã¯ã¿ãŒããä¿è·ãããŸãïŒã
ãã®ã³ãŒãã䜿çšãããšã䜿çšã¡ã¢ãªãåžžã«å¢å ããã®ã芳å¯ã§ããŸãã ã¡ã¢ãªã®éã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãå
¥ã£ãŠãæžå°ããŸããã å®éãé¢é£ããã¯ããŒãžã£ãŒã®ãªã¹ãïŒ theThing
倿°ã®åœ¢åŒã®ã«ãŒããæã€ïŒãäœæããŸãããããã®ã¯ããŒãžã£ãŒã®åã¹ã³ãŒãã«ã¯ã倧ããªã¡ã¢ãªãªãŒã¯ã衚ã倧ããªæååãžã®çŽæ¥ãªã³ã¯ãå«ãŸããŠããŸãã ããã¯å®è£
ææç©ã§ãã ã¯ããŒãžã£ãŒã®ç°ãªãå®è£
ã䜿çšãããšããã®ç¶æ³ãæœåšçã«åŠçã§ããŸããããã«ã€ããŠã¯ãMeteorããã°ã§èª¬æãããŠããŸãã
ã¬ããŒãžã³ã¬ã¯ã¿ãŒã®æãããªåäœ
ã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯äŸ¿å©ã§ãããæ¬ ç¹ãããããã®1ã€ã¯éæ±ºå®æ§ã§ãã ããã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãäºæž¬äžèœã§ããããšãæå³ããŸããéåžžãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããã€è¡ããããã倿ããããšã¯ã§ããŸããã ãã®çµæãããã°ã©ã ãå¿
èŠä»¥äžã®ã¡ã¢ãªãæ¶è²»ããå ŽåããããŸãã çãäžæåæ¢ã芳å¯ã§ããŸããããã¯ãã¢ã¯ã·ã§ã³ã«ãã°ããå¿çããããã°ã©ã ã§ç¹ã«é¡èã«ãªããŸãã
éæ±ºå®è«ãšã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããã€è¡ãããããæ£ç¢ºã«èšããªãããšãæå³ããŸãããã¬ããŒãžã³ã¬ã¯ã¿ã®ã»ãšãã©ã®å®è£
ã¯åæ§ã®åäœãããŸãã ã¡ã¢ãªãå²ãåœãŠãããŠããªãå Žåãã¬ããŒãžã³ã¬ã¯ã¿ã¯çŸããŸããã æ¬¡ã®ã·ããªãªãæ€èšããŠãã ããã
- ããªãã®æ°ã®ã¡ã¢ãªå²ãåœãŠãçºçããŸããã
- ã»ãšãã©ã®èŠçŽ ïŒãããããã¹ãŠïŒã¯å°éäžèœãšããŠããŒã¯ãããŸããïŒããšãã°ãäžèŠãªãã£ãã·ã¥ãžã®ãªã³ã¯ã
null
èšå®ãnull
ïŒã - åŸç¶ã®ã¡ã¢ãªå²ãåœãŠã¯è¡ãããŸããã
ãã®å Žåãã»ãšãã©ã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãã以äžã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸããã ã€ãŸããåŠçå¯èœãªå°éäžèœãªã³ã¯ããããŸãããã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãããã«åœ±é¿ããŸããã ãã®ãããªå°ããªãªãŒã¯ã«ãããã¢ããªã±ãŒã·ã§ã³ã¯å¿
èŠä»¥äžã®ã¡ã¢ãªãæ¶è²»ããŸãã Googleã¯ãã®åäœã®åªããäŸãæäŸããŸãã-JavaScriptã¡ã¢ãªãããã¡ã€ãªã³ã°ããã¥ã¡ã³ããäŸïŒ2 ã
Chromeã®ãããã¡ã€ãªã³ã°ããŒã«ã®æŠèŠ
Chromeã¯ãJavaScriptã§ã¡ã¢ãªæ¶è²»ããããã¡ã€ãªã³ã°ããããã®ããŒã«ã»ãããæäŸããŸãã ã¡ã¢ãªãæäœããããã®2ã€ã®éèŠãªããŒã«ã¯ãã¿ã€ã ã©ã€ã³ã¿ããšãããã¡ã€ã«ã¿ãã§ãã
ã¿ã€ã ã©ã€ã³ã¿ã

ã¿ã€ã ã©ã€ã³ã¿ãã¯ãç°åžžãªã¡ã¢ãªåäœãæ€åºããã®ã«éåžžã«åœ¹ç«ã¡ãŸãã 倧ããªãªãŒã¯ãæ€çŽ¢ããå Žåã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³åŸã«ãããã«æžå°ãã宿çãªãžã£ã³ãã«æ³šæããŠãã ããã ã¹ã¯ãªãŒã³ã·ã§ããã¯ãã¡ã¢ãªãªãŒã¯ãªããžã§ã¯ãã®ç¶ç¶çãªå¢å ã瀺ããŠããŸãã æåŸã«å€§ããªã¹ã€ãŒããè¡ã£ãåŸã§ããå æã¡ã¢ãªã®ç·éã¯æåããã倧ãããªããŸãã DOMããŒãã®æ°ãå¢å ããŠããŸãã ãã¹ãŠã¯ãDOMããŒãã«é¢é£ä»ããããã³ãŒãã«ãªãŒã¯ãããããšã瀺ããŠããŸãã
[ãããã¡ã€ã«]ã¿ã
![[ãããã¢ã€ã«]ã¿ã](https://habrastorage.org/files/714/0b2/b13/7140b2b132824448b6357ddbe5894241.png)
ã»ãšãã©ã®æéããã®ã¿ãã§äœæ¥ããŸãã ãããã¡ã€ã«ã䜿çšãããšãã¡ã¢ãªã®ã¹ãããã·ã§ãããäœæããããããçžäºã«æ¯èŒã§ããŸãã ã¡ã¢ãªé
åžããã»ã¹ãèšé²ããããšãã§ããŸãã ã©ã®ã¢ãŒãã§ããããŸããŸãªã¿ã€ãã®åºåã䜿çšã§ããŸãããæãéèŠãªã®ã¯äžè¬ãªã¹ããšæ¯èŒãªã¹ãã§ãã
äžè¬çãªãªã¹ãã¯ãããŸããŸãªã¿ã€ãã®é¢é£ãªããžã§ã¯ãã®æŠèŠãšãããã®ãµã€ãºã®çµã¿åãããæäŸããŸãïŒ æµ
ããµã€ãº ïŒè¡šé¢ãµã€ãºãç¹å®ã®ã¿ã€ãã®ãã¹ãŠã®ãªããžã§ã¯ãã®åèšïŒããã³ä¿æãµã€ãº ïŒä¿æãµã€ãºã衚é¢ãµã€ãºãããã³ããã«é¢é£ããä»ã®ãªããžã§ã¯ãã®ãµã€ãºïŒã ãŸãããªããžã§ã¯ãããã®ã«ãŒãïŒ è·é¢ãã£ãŒã«ãïŒããã©ãã ãé¢ããŠããããç¥ãããšãã§ããŸãã
æ¯èŒãªã¹ãã¯åãæ
å ±ãæäŸããç°ãªãã¹ãããã·ã§ãããæ¯èŒããããšãå¯èœã«ããŸãã ããã¯ãã¡ã¢ãªãªãŒã¯ãèŠã€ããããã«ç¹ã«éèŠã§ãã
äŸïŒChromeã䜿çšããŠãšã©ãŒãæ€çŽ¢ãã
ã¡ã¢ãªãªãŒã¯ã«ã¯äž»ã«2ã€ã®ã¿ã€ãããããŸããã¡ã¢ãªäœ¿çšéã®å®æçãªå¢å ãåŒãèµ·ãããªãŒã¯ãšããã以äžã¡ã¢ãªãå¢å ãããªãåäžã®ãªãŒã¯ã§ãã æããã«ã宿çãªãªãŒã¯ã远跡ããæãç°¡åãªæ¹æ³ã ããã«ããããã¯æãå±éºã§ãïŒæ¶è²»ãããã¡ã¢ãªãçµ¶ããå¢å ããŠããå Žåãæçµçã«ãã®ãããªãªãŒã¯ã¯ãã©ãŠã¶ãé
ãããããã¹ã¯ãªããã®å®è¡ã忢ããŸãã éåšæçãªæŒãã¯ãä»ã®äººã®éã§èªèãããã®ã«ååãªå€§ããã§ããã°ç°¡åã«èŠã€ããããšãã§ããŸãã éåžžãæ·±å»ãªåé¡ãåŒãèµ·ããããšã¯ãªããããå€ãã®å Žåæ€åºãããŸããã äžåºŠã ãçºçãããªãŒã¯ã¯ãæé©åã®åé¡ãšããŠã®ã¿èæ
®ããããšãã§ããŸãã ãã ãã宿çãªãªãŒã¯ã¯ä¿®æ£ãå¿
èŠãªå®å
šãªãã°ã§ãã
Chromeããã¥ã¡ã³ãã®äŸã®ã³ãŒããæ€èšããŠãã ããã
var x = []; function createSomeNodes() { var div, i = 100, frag = document.createDocumentFragment(); for (;i > 0; i--) { div = document.createElement("div"); div.appendChild(document.createTextNode(i + " - "+ new Date().toTimeString())); frag.appendChild(div); } document.getElementById("nodes").appendChild(frag); } function grow() { x.push(new Array(1000000).join('x')); createSomeNodes(); setTimeout(grow,1000); }
grow
颿°ãåŒã³åºããããšã <div>
ããŒãã®äœæãšDOMãžã®è¿œå ãéå§ãããŸãã ãŸãã倧ããªæååãé¢é£ä»ããŠãã°ããŒãã«ã¹ã³ãŒãã§äœæãããé
åã«ã¢ã¿ããããŸãã ããã«ãããã¡ã¢ãªãçå®ã«å¢å ãã調æ»ããããŒã«ã䜿çšããŠæ€åºã§ããŸãã
ã¬ããŒãžã³ã¬ã¯ã¿ãŒãæã€èšèªã¯ãã¡ã¢ãªã¹ã±ãžã¥ãŒã«ã®å€åã«ãã£ãŠç¹åŸŽä»ããããŸãã ããã¯ãéåžžã®ããã«ãã¡ã¢ãªã®äŒæãåšæçã§ããå Žåã«äºæ³ãããŸãã ã¬ããŒãžã³ã¬ã¯ã¿ãŒãå®è¡ããåŸãå
ã®ç¶æ
ã«æ»ããªãã¡ã¢ãªã®å®æçãªå¢å ãæ€èšããŸãã
宿çãªã¡ã¢ãªå¢å ãæ€åºããæ¹æ³
ãããè¡ãã«ã¯ã ã¿ã€ã ã©ã€ã³ã¿ããå¿
èŠã§ãã Chromeã§äŸãéããéçºããŒã«ãéãã ã¿ã€ã ã©ã€ã³ãéžæãã ã¡ã¢ãªãéžæããŠããšã³ããªãã¯ãªãã¯ããŸãã æ¬¡ã«ãããŒãžã«ç§»åããŠ[ The Button
]ãã¯ãªãã¯ããŸãã ã¡ã¢ãªãªãŒã¯ãå§ãŸããŸãã ãã°ããããŠãèšé²ã忢ããçµæã確èªããŸãã

ãã®äŸã§ã¯ãã¡ã¢ãªãªãŒã¯ãæ¯ç§äœæããç¶ããŸãã èšé²ã忢ããåŸãã¹ã¯ãªããã忢ããŠChromeãããŒãžãéããªãããã«ã grow
颿°ã«ãã¬ãŒã¯ãã€ã³ããèšå®ããŸãã ãã®ã¹ã¯ãªãŒã³ã·ã§ããã«ã¯ãã¡ã¢ãªãªãŒã¯ã®2ã€ã®å€§ããªå
åããããŸããããŒãã®ã°ã©ãïŒããŒããç·è²ã®ç·ïŒãšJavaScriptã³ãŒãã®ã°ã©ãïŒéè²ã®ç·ïŒã§ãã DOMããŒãã¯åžžã«æé·ããçž®å°ããããšã¯ãããŸããã ããã¯èããçç±ã§ãã
JavaScriptã³ãŒãã°ã©ãã¯ãã¡ã¢ãªæ¶è²»éã®çå®ãªå¢å ã瀺ããŠããŸãã ã¬ããŒãžã³ã¬ã¯ã¿ãŒã®ãããèªèãå°é£ã§ãã æåã«ã¡ã¢ãªãã©ã®ããã«å¢å ããæ¬¡ã«æžå°ããåã³å¢å ããŠãžã£ã³ãããç¶ããŠã¡ã¢ãªãããã«æžå°ããããªã©ã確èªã§ããŸãã ãã®ç¶æ³ã§éèŠãªã®ã¯ãã¡ã¢ãªãã¯ãªãŒãã³ã°ãããã³ã«ããã®åèšãµã€ãºã以åã®ãã®ããã倧ãããªãããšã§ãã ã€ãŸããã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ããªãã®éã®ã¡ã¢ãªãè§£æŸããŸãããããã§ãäžéšã¯å®æçã«ãªãŒã¯ããŸãã
ããã§ããªãŒã¯ãããããšãæããã«ãªããŸããã 圌女ãèŠã€ããŸãããã
2ã€ã®ã¹ãããã·ã§ãããæ®ã
ãªãŒã¯ãèŠã€ããã«ã¯ã ãããã¡ã€ã«ã»ã¯ã·ã§ã³ã«ç§»åããŸã ã ã¡ã¢ãªã®éãå¶åŸ¡ããã«ã¯ãããŒãžããªããŒãããŸãã ããŒãã¹ãããã·ã§ããã®ååŸæ©èœãå¿
èŠã«ãªããŸãã
ããŒãžãåèªã¿èŸŒã¿ããèªã¿èŸŒã¿ãå®äºãããããã«åçãæ®ããŸãã ãã®åçãåºç€ãšããŠæ®åœ±ããŸãã ãã®åŸã The Button
ããäžåºŠæŒããŠãæ°ç§åŸ
ã£ãŠãã2çªç®ã®ã·ã§ãããæ®ããŸãã åçãæ®ã£ãåŸã¯ãã¹ã¯ãªããã«ãã¬ãŒã¯ãã€ã³ãã远å ããŠãã¡ã¢ãªã®æ¶è²»ã忢ããããšããå§ãããŸãã

2ã€ã®ã¹ãããã·ã§ããéã®ã¡ã¢ãªã®åºããã远跡ããã«ã¯ã2ã€ã®æ¹æ³ããããŸãã [ ãµããªãŒ ]ãéžæããŠãããã¹ãããã·ã§ãã1ãšã¹ãããã·ã§ãã2ã®éã«å²ãåœãŠããããªããžã§ã¯ããå³ã¯ãªãã¯ãããã[ ãµããªãŒ ]ã§ã¯ãªã[ æ¯èŒ]ãéžæã§ããŸãã ã©ã¡ãã®å Žåãã2ã€ã®ã·ã§ããã®éã«çãããªããžã§ã¯ãã®ãªã¹ãã衚瀺ãããŸãã
ãã®äŸã§ã¯ããªãŒã¯ãæ€åºããã®ã¯éåžžã«ç°¡åã§ãããªãŒã¯ã¯å€§ããã§ãã Size Deltaã³ã³ã¹ãã©ã¯ã¿ãŒ(string)
泚æããŠãã ããã 8 MBããã³58ã®æ°ããããããã£ã : , , 8 MB.
(string)
, . . - , - retainers .

, . , x
. , â , . . çŽ æŽãããã â . DOM-, . , . Chrome , â Record Heap Allocations .
Record Heap Allocations
, , . . Record Allocation Timeline . , . . , ( , Chrome ).

, : , . . : ( (string)
), â DOM-, â Text
( DOM-).
HTMLDivElement
Allocation stack .

! , ( grow
-> createSomeNodes
). , , HTMLDivElement
. , , , . , , . . , , ( createSomeNodes
). .
: , Dev Tools -> Settings "record heap allocation stack traces" .
Allocation Summary :

. grow
createSomeNodes
. grow
, . (string)
, HTMLDivElement
Text
, , , .
. ãããã䜿çšããŸãã ( ). , , , , ( ).
远å è³æ
Memory Management â Mozilla Developer Network
JScript Memory Leaks â Douglas Crockford (old, in relation to Internet Explorer 6 leaks)
JavaScript Memory Profiling â Chrome Developer Docs
Memory Diagnosis â Google Developers
An Interesting Kind of JavaScript Memory Leak â Meteor blog
Grokking V8 closures
ãããã«
, , JavaScript, . , . , . . , . , .
: 4 Types of Memory Leaks in JavaScript and How to Get Rid Of Them , : Sebastián Peyrott .
: aalexeev , : iamo0 , jabher , spearance , zeckson , , .