JavaScript ã¨é¢æ°ã¨ã¯ãã¼ã¸ã£
JavaScript ã§ã©ããã¯ãã¼ã¸ã£ãªã®ããã¨ãã話ãè峿·±ãã£ãã§ã!
ã»ãã»ãã ã¯ãã¼ã¸ã£ãªã®ãã©ããèãã以åã«ãã©ãããæåã示ãã®ããèããã®ãé£ããã§ãããï¼ï¼ eval ã®æåã®éããªããã¯çæ°ãæããããå¾ã¾ãã!
ããããã"use strict" ã®æç¡ (strict ã³ã¼ããã©ãã) ã§ã eval ã³ã¼ãã®å¤æ°ç°å¢ã®åæåå¦çãå¤åãã¾ãã é£ããã§ãã!!
var e1 = (function () { var msg = "颿°ã®ä¸ã§ã"; return eval("var msg; (function() { return msg; })"); }).call(this); console.log(e1()); //=> "颿°ã®ä¸ã§ã" // strict ã³ã¼ãã 㨠eval ã³ã¼ãç¨ã«æ°ããªã¹ã³ã¼ããä½ãããã®ã§ã // eval ã³ã¼ãä¸ã® msg (undefined) ã颿°å ã® msg ("颿°ã®ä¸ã§ã") ãé ãºããã var e2 = (function () { "use strict"; var msg = "颿°ã®ä¸ã§ã"; return eval("var msg; (function() { return msg; })"); }).call(this); console.log(e2()); //=> undefined
ãã®æåã«ã¤ãã¦ã ECMA-262 5.1th の 10.4.2 節 ã«æ¸ããã¦ãã¾ãã
ECMA-262 5.1th の 10.4.2 節
- 3. If the eval code is strict code, then
- a. Let strictVarEnv be the result of calling NewDeclarativeEnvironment passing the LexicalEnvironment as the argument.
- b. Set the LexicalEnvironment to strictVarEnv.
- c. Set the VariableEnvironment to strictVarEnv.
ããã¯ã¨ãããã¯ãã¼ã¸ã£ã«ã¤ãã¦
颿°ã®ä¸ã«é¢æ°ãæ¸ãããã¨ããã®ã¯èª¬æããã®ã«é½åãè¯ãã¨ããã ãã§ãã¯ãã¼ã¸ã£ã®æ¬è³ªã§ã¯ãªãã¨æãããã§ããã ãã®èãã ã¨ã©ããã¦ãä¸éã¨ãããçãã¦ããããã«æãã¾ãã ã¯ã£ããã¨ããçããåºããªãã®ã§ããçããã¯ã©ããèãã§ããããï¼ ä½ããã®åå¿ãããã¨å¬ããã§ãã
回答:どれが「クロージャ」でしょうか? - hogehoge @teramako
ã¯ãã¼ã¸ã£ã®èª¬æã¨ã㦠ããã¼ã«ã«å¤æ°ãåç §ãã¦ãã颿°å 颿°ã ã¿ãããªãã¨ãæ¸ããã¦ããã®ã¯ç¢ºãã«ããç®ã«ãã¾ããã説æã¨ãã¦ã¯å¾®å¦ã ãªã¼ãã¨ããæ°ã¯ãã¾ãã
- ECMAScript (JavaScript) ã§ã¯ã¹ã³ã¼ããå½¢ä½ãã®ã¯ä¸»ã«é¢æ°
- ã¹ã³ã¼ããã§ã¤ã³ã®ããä¸ã«ã°ãã¼ãã«ã¹ã³ã¼ããããå ´åã¯ã¯ãã¼ã¸ã£ã ã¨ã¿ãªãã¦ãã¯ãã¼ã¸ã£ãããªãã¨ã¿ãªãã¦ãå®ç¨ä¸ã©ã¡ãã§ããã (ECMA-262 ã®ä»æ§çã«ã¯åçä¸ã¯ã¯ãã¼ã¸ã£ã ã¨æããã©)
ã¨ãã 2 ç¹ãããJavaScript ã«ããã ã¯ãã¼ã¸ã£ã®èª¬æã¨ãã¦ã¯ ã颿°å ã§å®ç¾©ããã颿°ãã¯ãã¼ã¸ã£ (ã§ãããå¤å´ã®é¢æ°ã®ãã¼ã«ã«å¤æ°ã«ã¢ã¯ã»ã¹ã§ããã¨ããªãã¨ã)ããã¨ãã説æãããããããä¸è¬åããããããã®ãªãã ã¨æãã¾ãã ããããã颿°å ã§å®ç¾©ãããã ã¨ãããã¨ã¯ç¹ã«æ¬è³ªçã§ã¯ãªãã§ãããã
åçä¸ã¯å ¨ã¦ã® ECMAScript ã®é¢æ°ã¯ã¯ãã¼ã¸ã£?
æ¬è³ªçã«ã¯ãã¯ãã¼ã¸ã£ã¨ã¯
- 颿°ãªãã¸ã§ã¯ãã§ããã
- èªèº«ãçæãããç°å¢ã®å¤æ°æç¸ãä¿æãã¦ãããã®
ã ã¨æãã¾ãã®ã§ãåçä¸ã¯ ECMAScript ã®é¢æ°ã¯å
¨ã¦ã¯ãã¼ã¸ã£ã¨è¨ã£ã¦è¯ãã®ã§ã¯ãªãããªã¼ã¨æã£ãããã¦ã¾ãã (ããããããªãã§ãã)
- ã¨ã¯ããã°ãã¼ãã«ã¹ã³ã¼ãã§å®ç¾©ããã颿°ãã¯ãã¼ã¸ã£ã¨ã¿ãªããã©ããã¯å¾®å¦ãªæãã¯ãã
- å®ç¨ä¸ã©ã¡ãã§ãããããããã¦ã¯ãã¼ã¸ã£ã ã¨ã¿ãªãã¦ãç¹ã«å©ç¹ã¯ãªãæ°ããã
è¿½è¨ : Function ã³ã³ã¹ãã©ã¯ã¿ã§ä½ããã颿°ã¯ã¯ãã¼ã¸ã£ãããªãã§ãã
æ¸ãã¦ããæ°ã¥ãããã© Function ã³ã³ã¹ãã©ã¯ã¿ã§ä½ããã颿°ã¯ã¯ãã¼ã¸ã£ãããªããããå
¨ã¦ã®é¢æ°ã¯ã¯ãã¼ã¸ã£ã ã¨ããã®ã¯ééã£ã¦ã¾ããã ãããã
å°ãªãã¨ã ã颿°å ã§å®ç¾©ããã颿°ãã¯ãã¼ã¸ã£ã ããã¨ããã®ã¯ããããã¨æã
ä¾ãã° catch ãããã¯ä¸ã§å®ç¾©ããã颿°ã¯ catch ãããã¯ã®ã¹ã³ã¼ããæã¤ãããªã®ã§ããã¨ã颿°ã®ä¸ã§å®ç¾©ããã¦ãªãã¦ãããã¯ã¯ãã¼ã¸ã£ãªãããªã®ã§ãã颿°å ã§å®ç¾©ããã颿°ã ã§ãããã¨ã¯ã¯ãã¼ã¸ã£ã§ããããã®å¿ è¦æ¡ä»¶ã§ã¯ãªãã§ãããã
var count = 100; try { throw 0; } catch (count) { var countup = function () { return ++count }; } // 颿° countup ã¯ã°ãã¼ãã«ã¹ã³ã¼ãã§ã¯ãªã夿°ç°å¢ã¸ã®åç §ãä¿æãã¦ãã // countup ã¯ã¯ãã¼ã¸ã£! console.log(countup()); //=> 1 console.log(countup()); //=> 2 console.log(countup()); //=> 3
ã¨ããªãã¨ãèããããã¾ããã