
MapãWeakMapãSetãªã©ã®ãã°ãããããšã«é¢ããèšäºã¯ãã§ã«ããã«æ²èŒãããŠããŸããããå®éã«ã¯ãããã®APIã®å®éã®æ©èœã¯æããã«ãªããŸããã§ããïŒããã§ãæ€çŽ¢ãããŸãå©çšããå ŽåïŒã
ãããã®APIã¯ãFirefoxïŒChrome Canaryã«å«ããããšãã§ããŸãïŒä»¥å€ã«ã¯å®éã«ã¯å®è£ ãããŠããŸããããæè¿ãŸã§ãããŒãšããŠã®HTMLElementã®ãããªãªããžã§ã¯ãã®äœ¿çšã¯ãµããŒããããŠããŸããã§ããã ããšãã°ãããªããŒã¯ããã3é±éåã«åé€ãããŸãã
if (navigator.userAgent.indexOf('Firefox/') > -1)
ãªã圌ãã¯ãšãŠãè¯ãã®ã§ããïŒ æ¬è³ªçã«ãMap / WeakMapã¯éåžžã®ããã·ã¥ãªããžã§ã¯ããšããŠèªèã§ããããŒãšããŠäœ¿çšã§ããã®ã¯è€éãªãªããžã§ã¯ãïŒãªããžã§ã¯ããé¢æ°ãé åïŒã®ã¿ã§ããããã¯ãå 容ã«åŸã£ãŠã§ã¯ãªãã¡ã¢ãªå ã®ã¢ãã¬ã¹ã«ãã£ãŠãã€ã³ãã£ã³ã°ãè¡ãããããã§ãã
ãããã£ãŠãããã³ããšã³ãã«æ¥ç¶ããããšãå¯èœã«ãªããŸã
- domèŠçŽ
- XHRãªã¯ãšã¹ã
- ãã¡ã€ã«èŠçŽ
ããã«ãããèŠçŽ ã®idèŠçŽ ãªãã§äœæ¥ããããããŒã¿ãã€ã³ãã£ã³ã°ãäœåãéãããããpromiseã®ã¯ã¬ã€ãžãŒãªä»£æ¿å®è£ ãäœæãããããããšãã§ããŸãã
WeakMapã«ã€ããŠèª¬æããŸãã ããã§ã¯ãªããWeakMapã®æ¢åã®ããªãã£ã«ã«ã€ããŠèª¬æããŸãã
æ®ãã®èŠçŽ ã«ã€ããŠã¯ïŒ
ãããã¯ãããŒãããªããã£ããŸãã¯ãªããžã§ã¯ãã®ããããã§ããããã·ã¥ã§ãã
ã»ããã¯ãäžæã®èŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ã§ãã Mapã®äžã«æ§ç¯ããã®ã¯éåžžã«ç°¡åã§ãã ãã®æãéèŠãªå©ç¹ã¯ãé åã®åŠçã§ããããã«ãããuniqåé¡ã®è€éããOïŒn ^ 2ïŒããOïŒnïŒã«æžããããšãã§ããŸãã
node.jsã䜿çšããŠãDBMSãæäœããæ©èœãããã¯ãšã³ãã«ã©ã®ãããªæ©èœãåããŠãããã«ã€ããŠã¯ããããããå§ãããŸããã
æ§æã¯ãå€å žçãªãªããžã§ã¯ãã®æ§æãããå°ãè€éã§ãããéåžžã«ç解å¯èœã§èªã¿ããããã®ã§ãã
var map = new WeakMap; map.set(someObject, 'someKey'); alert(map.get(someObject)); map.delete(someObject);
cornerJSã®ä»¥åã®ããŒãžã§ã³ã®1ã€ãå«ãããã€ãã®ãããžã§ã¯ãã§ã¯ããã®ãããªãœãªã¥ãŒã·ã§ã³ã¯ã³ãŒãã®ç°¡æœããšèªã¿ãããã®èŠ³ç¹ããæ£åœåãããŸããããããªãã£ã«ã®1ã€ã䜿çšããããšããäºå®ã«ããããã®ãœãªã¥ãŒã·ã§ã³ã¯é¡èã«ã¡ã¢ãªãæ¶è²»ãããšèããŸããã
ecmascript.orgã®å®è£ ã¯ããªãã·ã§ã³ãšããŠåæ§ã®å®è£ ãæäŸããŸãïŒç䌌jsãããããçž®å°ãããå®è¡å¯èœãã¡ã€ã«ã githubã§ã®å®å šãªå®è£ ã«è»¢éãããŸãïŒã
window.WeakMap = function () { var keyList = []; var valueList = []; return Object.freeze({ 'get': function (key, defaultValue) { var index = keyList.indexOf(key); var value = valueList[index]; return index === -1 ? defaultValue : value; }, 'set': function (key, value) { var index = keyList.indexOf(key); if (index === -1) { keyList.push(key); valueList.push(value); } else { valueList[index] = value; } } //...( has, delete clear) }); };
ãã®å®è£ ã«ã¯å€ãã®åé¡ããããŸãã
ãŸããã¡ã¢ãªã¯èããæµããŸããèŠçŽ ãåé€ãããŠããkeyListã«æ®ããŸãããã®ãããªWeakMapãå®éã®ãããžã§ã¯ãã§åäœããå Žåã倧éã®ã¡ã¢ãªãåºæ¬çã«æ¢ã«åé€ããããªããžã§ã¯ãã®ã¹ãã¬ãŒãžã«ãªãŒã¯ããå¯èœæ§ããããŸãã GarbageCollectorã¯èŠçŽ ã§ã¯æ©èœããããã®ããããŸã ååšããŠãããšèŠãªãããŸãã
ãšã³ãžã³ã¬ãã«ã§ã¯ããã¯è§£æ±ºã§ããŸãããããã§ãGarbageCollectorãæ£ããæ©èœããªãå ŽåããããŸãã
次ã«ãkeyListã«å€ãã®èŠçŽ ãããå ŽåãMacBook Air 2013ã®chromeã§ã¯åŸè ã®éžæã«æéãããããŸãã1e9thèŠçŽ ã®æ€çŽ¢ã«ã¯1ç§ä»¥äžããããŸããã ã¿ã¹ã¯ã®è€éãã¯OïŒnïŒã§ãããããã©ãŒãã³ã¹ã«å€§ãã圱é¿ããå ŽåããããŸãã
ãµã³ããªã³ã°ã¬ãŒãã«é¢ããåé¡ã解決ããåé¡ã®è€éããOïŒ1ïŒã«æžãã代æ¿ã®å®è£ ããããŸãã
window.WeakMap = (function(){ var counter = Date.now() % 1e9; return function(){ var name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__'); return { set: function(key, value) { var entry = key[this.name]; if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {value: [key, value], writable: true}); }, get: function(key) { var entry; return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined; } } } })();
ãã ããããã¯ã¡ã¢ãªã®åé¡ã解決ãããã®ã§ã¯ãªããããã«æªåãããŸãã 埪ç°ãªã³ã¯ãåèŠçŽ ã®ã¡ã¢ãªã«è¡šç€ºãããŸãïŒkey [name] [0] === keyã ãªãŒãã³ããã¥ã¡ã³ããä¿¡ããŠããå Žåãã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãã®ãããªã·ããªãªããã£ããããããšãã§ããªããããæéãçµã€ã«ã€ããŠã¡ã¢ãªãè©°ãŸã£ãŠããŸããŸãããå€ãã®æéãããããŸãã
ãã®ãããPolymer / X-tagsãæ éã«äœ¿çšãã䟡å€ãããããã®å€ãã¯WeakMapã«äŸåããŠããŸãïŒäžèšã®å®è£ ãå°ãæžãããŸãïŒã ãã®ãããããšãã°ãMutationObserverã®ããªãã£ã«ã¯ããã«åºã¥ããŠããŸããããã¯ãMatationObserverã ãã§ãªããå€æ°ã®ãµãŒãããŒãã£ãããžã§ã¯ãã§ã䜿çšãããŠããŸãããã®å€ãã¯ãã¡ã¢ãªã®åé¡ãèªèããŠããŸããã
æ£çŽãªå®è£ ãšæ¯èŒããŠãããã«ãã€ãã¹ãè¿œå ãããŸãã ãã®ãã¡ã®1ã€ã¯ãã»ãšãã©ã®å ŽåéèŠã§ã¯ãããŸãããåçµããããªããžã§ã¯ãã«ã¢ã¿ããããæ©èœã倱ãããŸãã äžéšã®äººã«ãšã£ãŠã¯2çªç®ã¯éåžžã«æ·±å»ã§ãã ãã®å®è£ ã¯IE9 +ã«ãªããŸãã æåã®ãªãã·ã§ã³ã¯éåžžã«åçŽãªã®ã§ã MozillaããArray.prototype.indexOfããªãã£ã«ãæ¥ç¶ãããšIE6 +ã§åäœããŸãã Array.prototype.indexOfãIE9ã§ç»å ŽããŸããããå°ãªããšãå®è£ å¯èœã§ãã Object.definePropertyãšã¯ç°ãªãïŒå³å¯ã«èšãã°ãIE8ã§ã¯DOMèŠçŽ ã®definePropertyããµããŒããããŠããŸãããããã«äŸåããããšã¯ã§ããŸããïŒã
ãã®çµæã倧éã®ã¬ã³ãŒãã®åŠçãé ããªãããããŒèŠçŽ ã«è¿œå ã®ããããã£ïŒå€éšããã¢ã¯ã»ã¹ããããšãæå³ããå ŽåããããŸãïŒãã€ãã¬ãŒã¿ãŒã®äžéšã«åé¡ãçºçãããããã®å Žåãè¿œå ã®å±æ§ã§ãã£ã±ãã«ãªããŸãã
jQueryã«ã¯WeakMapsã®å®è£ ããããŸãã jQuery.dataïŒèŠçŽ ãããŒïŒãèŠæ±ãããšããWeakMapå®è£ ã®1ã€ã䜿çšããŠããŸãã å°ãç°¡åã«æ©èœããŸãã
ããããããªãã¯ããªãã®ã³ãŒãã§æ¬¡ã®ãããªãã®ãèŠãããšããããŸãïŒ
document.body.jQuery19104357186993584037 20
ããã§ããããjQueryç¬èªã®WeakMapã®èŠçŽ ã®IDã§ããããšãããããŸããã
èŠçŽ ãåé€ããããšãããã¯åé€ãããŸãããããã§ãïŒ
- å€éšã®ããŒã¿å€æŽããä¿è·ãããŠããŸããã
- å€ã®ã¡ã¢ãªãªãŒã¯ããä¿è·ãããŠããŸãã-ããŒã¯åé€ãããŸããããããã«é¢é£ä»ããããå€ã¯ã¡ã¢ãªã«ä¿åãããŸãã
ããã§äž»èŠãªéšåã«è¡ããŸãã
WeakMapã®ååã¯ãGCã§èæ ®ãããŠããªã匱ãåç §ã匱åç §ãå®è£ ãããã£ãããã§ããããããããã®ããŒã®ä»ã®ãšã³ããªããªãå ŽåãããŒãšå€ã®äž¡æ¹ãåé€ãããŸãã
æ£ããå®è£ ã§ã¯ãããŒãšå€ã®äž¡æ¹ãåé€ããå¿ èŠããããŸãã
ããããèŠåºãã®githubã«ãããªããžããªã®1ã€ã§ãé©ãããšã¯ã§ããŸãããããã¬ãŒãºã«åºããããŸã§ããããå¯èœã ãšã¯æããããŸããã§ããã
æŒãã®ãªãOïŒ1ïŒã«ãã¯ã¢ããæéã®WeakMapã®Shim
ããã¯Object.definePropertyã«äŸåããŸã-ããã¯IE9 +ããã³ããªãŒãºããããªããžã§ã¯ããåç §ã§ããªãããšãæå³ããŸãããèŠçŽ ã«ã¯æ°ããå±æ§ããããŸããã§ããã
ãªããžããªèªäœã¯ãã¡ãã§ãïŒ https : //github.com/Benvie/WeakMap/
ç§ã¯ãããã©ãã»ã©çå®ã§ãããããã§ãã¯ããããšã«æµæã§ããŸããã§ããã
ãã®ããã«ãã¡ã¢ãªã¹ãããã·ã§ããã䜿çšããç°¡åã§è¿ éãªãã¹ããè¡ââãããŸããã
- æåã®ããŒãžã¯ç©ºçœã®ããŒãžã§æ®åœ±ãããŸããïŒ éãç¢å° ïŒ
- ããªãã£ã«ã®å®è£ ã§2çªç®ã«æå°ïŒ é»è²ã®ç¢å° ïŒ
- 3çªç®ã¯ãèŠçŽ ãäœæããŠã¡ã¢ãªã«å ¥åããåŸã«åé€ãããŸããïŒ èµ€ãç¢å° ïŒ
- 4çªç®ã¯ãèŠçŽ ãžã®æ®ãã®ãªã³ã¯ãåé€ãããåŸã«åé€ãããŸããïŒ ç·ã®ç¢å° ïŒ
ã³ãŒããå®å šã«ãã¹ããã
// "" 1 // // "" 2 var someStorage = []; var map = new WeakMap; var length = 1e5; // ie 1e4, 1e5 10 . for (var i = 0; i < length; i++) { someStorage[i] = {randomValue: Math.random() * 1e9 >>> 0}; // , - garbage collector map.set(someStorage[i], {otherRandomValue: Math.random() * 1e9 >>> 0}) } // "" 3 for (var i = 0; i < length; i++) { someStorage[i] = void 0; } // "" 4
çµæã¯æ¬¡ã®ãšããã§ãã
Chrome 30ïŒMac 10.9ïŒ

Firefox 24ïŒMac 10.9ïŒ

IE 11ïŒWin 8.1ïŒ

ç§ã¯æ£çŽã«èªããŸã-ã¢ããªã±ãŒã·ã§ã³ã䜿çšãããã¹ãŠã®ã¡ã¢ãªïŒããŒãšå€ã®äž¡æ¹ã®ã¡ã¢ãªïŒãæŸæ£ãããããšãèŠãŠã·ã§ãã¯ãåããŸããã
ãã®åŸã念ã®ãããæ€çŽ¢æéãæ¬åœã«OïŒ1ïŒã«ãªãããã«ããŸããã ããã¯çå®ã§ããããšãå€æããŸããã
Chrome 30ïŒMac 10.9ïŒ

Firefox 24ïŒMac 10.9ïŒ

æåŸã«ãããã¯ãã¹ãŠçå®ã§ãã WeakMapã¯å®éã«å€æ°ã®ãããžã§ã¯ãã§äœ¿çšã§ããããŒã¿ãã€ã³ãã£ã³ã°ãããµãŽã§ã®äœæ¥ãå€æ°ã®ãã©ã°ã€ã³ã®äœæã«å€§ããªå¯èœæ§ãäžããŸããããã¯ã5ã€ããšã«IE8 +ãããžã§ã¯ããšIE9 +ã®æ®ãã®5ã€ã ããããå Žåã«ãä»æ¥è¡ãããšãã§ããŸãã åæã«ãWeakMapã¯ç¹å®ã®çš®é¡ã®ããŒã¿ã®åŠçãç°¡çŽ åããã ãã§ãªããããã©ãŒãã³ã¹ã®åäžãšæé©åãå¯èœã«ããå Žåã«ãã£ãŠã¯ã¡ã¢ãªã®åŠçãå€§å¹ ã«æ¹åããŸãã
äž»ãªããšã¯ãé©åãªããªãã£ã«ãéžæããããšã§ãã
ãšããã§ã次ã®ãããªããã«ããªãã£ã«ãäœæã§ããŸãã
if (Object.defineProperty) { window.weakMap = //O(1) } else { window.weakMap = //O(n) , }
ãã¡ããããã®ãœãªã¥ãŒã·ã§ã³ã§æãèå³æ·±ãã®ã¯ããã®ä»çµã¿ã§ãã 解決çã¯éåžžã«çŽããããã®ã§ããããç解ããããã«ãèè ïŒ Brandon Benvie ïŒã«é£çµ¡ããŠãæãçŽãããã詳现ãç解ããããã«åœŒã«ããã€ã質åãããªããã°ãªããŸããã§ããã
ç§ã¯ä»ã®èª°ãã®ã³ãŒãã«åŸ¹åºçã«è§Šããã®ã¯å¥œãã§ã¯ãããŸããããããã¯å®è£ ããã®ãä¿¡ããããªãã»ã©èå³æ·±ããã®ã§ãããããã©ã³ãã³ïŒèè ïŒã¯ES3ã§ES6ã³ã³ãã€ã©ãæžããapp.jsïŒããŒãäžã®ãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³çšã®ãã©ãããã©ãŒã ïŒãäœæããŸããJSã§ããã«è€éãªãœãªã¥ãŒã·ã§ã³ãå®è£ ããŸããã
å 責äºé ïŒã»ãšãã©ã®äŸã§ã¯ãèªã¿ãããããããã«ã³ãŒãããããã«åæžãããŠããŸããäžéšã®ãã§ãã¯ã¯åé€ãããäžéšã¯ã€ã³ã©ã€ã³åãããŠããŸãã ããã§åŒçšããŠããã³ãŒãã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒãã¡ã¢ãªã解æŸã§ããããã«ããããã®äžçš®ã®ã·ã£ãŒãããºã ã§ããããã³ãŒããããé«éã«åäœãããããæ®éã®äººãç°¡åã«æ··ä¹±ãããŠæããããããšãã§ãããããå®éã®äœ¿çšã«ã¯ãå§ãããŸããå¹³åçãªããã³ããšã³ãéçºè ã
æåã¯ããã¹ãŠã®ã¡ãœãããæ»ãããšãæ··ä¹±ãããå¯èœæ§ããããŸã
function toString() { [native code] }
ãã®å Žåããã€ã³ãã¯ã©ãã§ãè¡ããããéåžžã®é¢æ°ããã®ãããªé¢æ°ã«å€ããããšãã§ããŸãã
ãã ãã次ã®ããã«èšå®ãããprepã¡ãœããã¯ããã¹ãŠãã¯ããã«åçŽã§ããããšãå€æããŸããã
var prep = { __proto__: [] } instanceof Array ? function(f){ f.__proto__ = stringifier } : function(f){ define(f, stringifier) };
ç¹å®ã®èŠçŽ ããããã¿ã€ãåãã__proto__ãªããžã§ã¯ããäœæããŸãã
stringifierã¯å¥ã®é¢æ°ã§ãã
var stringifier = function toString(){ return src[0] + nameOf(this) + src[1]; };
ããã¯toStringã¡ãœãããšããŠããèªèº«ã«èšå®ãããŸãïŒç§ãç解ããŠããããã«-ããã¯ç°¡æœã«ããããã§ãïŒã ãã®çµæãå®éã«ã¯æ¬¡ã®ãããªãã®ãåŸãããŸãã
a.__proto__ = { toString: function(){ return "function "+this.name+"() { [native code] }" } }
ã¡ãªã¿ã«ããã®ç¹å®ã®ã³ãŒãã¯ãé¢æ°ã®nameå±æ§ããã¹ãŠã®JSå®è£ ã§å©çšã§ããããã§ã¯ãªããããç¹ã«ããŸãæ©èœããŸãããããã䜿çšããã®ã¯æªãç¿æ £ãšèŠãªãããŸãã é¢æ°ã¯ç°å¢ïŒååãå«ãïŒã«äŸåãããã©ã®ãããªæ¡ä»¶äžã§ãåãããã«æ©èœããå¿ èŠããããŸãã
Function.prototype.nameã¯ãã¹ãŠã®å®è£ ã§äœ¿çšã§ããããã§ã¯ãªããããBrandonã³ãŒãã§ã¯ãé¢æ°åã¯æ¬¡ã®ããã«å®çŸ©ãããŠããŸãã
function nameOf(func){ return 'name' in func ? func.name : toSource.call(func).match(/^\n?function\s?(\w*)?_?\(/)[1]; }
defineïŒstringifierãstringifierïŒãåé€ããã ãã§ååã§ãããã³ãŒããæ··ä¹±ãé²ãããšãã§ããŸãã
ãã®ãããããŒã®ä¿åå Žæãç解ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãå€ãèšå®ããseté¢æ°ã«åé¡ããŸãã
function set(key, value){ unwrap(this).set(key, value); } function get(key){ return unwrap(this).get(key); }
ãããŠããããã楜ãã¿ãå§ãŸããŸãã
var unwrap = function(weakMap){ return data.unlock(weakMap).value; }
dataã¯å éšã¯ã©ã¹Dataã®ã€ã³ã¹ã¿ã³ã¹ã§ãããããèªäœã¯WeakMapã«éåžžã«äŒŒãŠããŸãããgetãšsetã®2ã€ã®ã¡ãœãããããããŸããããweakMapèªäœã¯ãã¹ãŠ1ã€ã®å€§ããªDataãªããžã§ã¯ãã«æ ŒçŽãããŸãã 1ã€ã®ããŒã¿ãªããžã§ã¯ãã
ãã¹ãŠã®WeakMapãæ ŒçŽããã¡ã¿WeakMapïŒã¹ããŒããã¹ããŒããšåŒã¶å ŽåïŒããããŸããåWeakMapã«ã¯ããªããžã§ã¯ãã®ããŒãšå€ã®ãã¢ããã§ã«å«ãŸããŠããŸãã
ãããŠæåŸã«ãDataãªããžã§ã¯ãã§æãèå³æ·±ãããšã§ãã
æåã®ç§:ïŒããŒã®äžè¬çãªã»ããããå€ãé衚瀺ã«ããŠãã©ã®ã€ãã¬ãŒã¿ã«ã該åœããªãããã«ããŸãã ãããè¡ãã«ã¯ãgetOwnPropertyNamesãåå²ãåœãŠããŸã
Object.defineProperty(Object, 'getOwnPropertyNames', { value: function getOwnPropertyNames(obj){ var props = getProps(obj); if (Object.prototype.hasOwnProperty.call(obj, globalID)) // hasOwnProperty, - . props.splice(props.indexOf(globalID), 1); return props; } });
çµæãšããŠãchromiumãããã¬ãŒã§ãããããããã£ã®ååšãçã£ãŠããŸããã

2çªç®ã®ããªãã¯ïŒ
function storage(obj){ if (hasOwn.call(obj, globalID)) return obj[globalID]; // Object.isExtensible var store = create(null); defProp(obj, globalID, { value: store }); return store; };
åºåã§ã¯ãããŒå€ãæã€äžæã®ãªããžã§ã¯ããååŸããŸãã
function Data(){ var puid = createUID(), // 16- secret = {}; // - WeakMap , . , , . â private Data this.unlock = function(obj){ var store = storage(obj); if (hasOwn.call(store, puid)) return store[puid](secret); var data = Object.create(null, { value: { writable: true, value: undefined } }); Object.defineProperty(store, puid, { value: (function(secret,data){ return function(key){ if(key===secret) return data } })(secret, data) }); return data; } }
æåã®éåžžã«èå³æ·±ãè¡ã¯æ¬¡ã®ãšããã§ãã
Object.create(null, { value: { writable: true, value: undefined } });
nullããç¶æ¿ãããªããžã§ã¯ããäœæããŸããããã«ãããæ¡åŒµã®ãªããããŒãªããžã§ã¯ããæäŸãããŸãã次ã«ã2çªç®ã®åŒæ°ãšããŠpropertiesObjectãæž¡ããŸããããã«ãããdefinePropertyãä»ããŠå¿ èŠãªå€ãèšå®ã§ããŸãã æ瀺çã«å€ãäœæããŸããããããæ¢ã«ååšãããã®åŸãã§ãã¯ïŒããŒã¿ã®ãå€ãïŒãæž¡ãããã ãã«ãæªå®çŸ©ã§æž¡ããŸãã
2çªç®ã®éåžžã«èå³æ·±ãè¡ïŒ
Object.defineProperty(store, puid, { value: (function(secret,data){ return function(key){ if(key===secret) return data } })(secret, data) });
æ¬è³ªçã«ãåWeakMapã«åºæã®äžæã®ç¹å®ã®ãããŒãªããžã§ã¯ããååŸããç§å¯ããŒãšäžèŽããå Žåã«æ ŒçŽãããå€ãè¿ãé¢æ°ãååŸããŸãã
å®éãå ã®ã³ãŒãã§ã¯ããã«æ··ä¹±ããŠããŸãã
defProp(store, puid, { value: new Function('s', 'l', 'return function(k){if(k===s)return l}')(secret, data) });
ãã©ã³ãã³ã¯æ¬¡ã®ããã«ã³ã¡ã³ãããŸããã
åã«ããã©ãŒãã³ã¹ã ãªãã©ã«é¢æ°ãå®çŸ©ããããšã«ãããã¹ã³ãŒãå ã®ãã¹ãŠã®ããŒã«ã«å€æ°ãåã蟌ãããšãã§ããŸãã ãé¢æ°ãã䜿çšããããšã§ãã¹ã³ãŒãå ã®å¯äžã®ãã®ã¯ã°ããŒãã«ãªããžã§ã¯ãã§ãã ç®æšã¯ãäžæ³šæã«ããã¡ã¢ãªãªãŒã¯ãé²ãããšã§ããã ã䜿ãã®ããŒãžã§ã³ãããããæ£åžžã«åäœããŸããããã以å€ã®å Žåã¯ä¿æãããªãåç §ããªãŒã¯ããå¯èœæ§ããããWeakMapã䜿çšããç®çã®å€ãã¯ããã®çš®ã®ãªãŒã¯ãé²ãããšã§ãã
ãã·ã¢èªãžã®ç¡æã®æ¡åŒµç¿»èš³ã§ã¯ïŒ
ããã¯ããã©ãŒãã³ã¹ã®ããã«è¡ãããŸãã functionïŒïŒ{}ã䜿çšããŠé¢æ°ãäœæããããšã«ãããããŒã«ã«ã®ããµãŽã«ãã€ã³ãããŸã-ãããªãæ¹æ³ã§ãããã䜿çšããªããšããäºå®ã«ããããããã ãããã¬ãŒã䜿çšããå Žåããã®é¢æ°ã®å éšãããäœæãããé åå šäœãå©çšå¯èœã§ããããšãããããŸãã
new Functionã¯ãã°ããŒãã«ã¹ã³ãŒãã§æ©èœããé¢æ°ãäœæããããŒã«ã«ã¹ã³ãŒããžã®ãã€ã³ãã£ã³ã°ãåé€ããŸãã å®è£ ã®ç®çã¯ã¡ã¢ãªãªãŒã¯ããªãããšã§ãããããã§è¡ããããã¹ãŠã®äœæ¥ã¯ãäž»ã«ãªãŒã¯ããªãããšã«å¯ŸããŠè¡ãããŸããã
ãã®çµæãå®éã«ã¯ãã¡ã¢ãªå ã®äœãã®ããã«èŠããŸãã
var map = new WeakMap; var a = {}; map.set(a, ['test']) console.log(a['2ql3g5ae6pcwstt9']['o6tnzx1xskf39pb9']) >function (k){if(k===s)return l}
['2ql3g5ae6pcwstt9']ã¯ãä»»æã®weakMapã«è©²åœãããã¹ãŠã®èŠçŽ ã«å ±éã®ã©ã³ãã ã«çæãããglobalIDããã®ååãæã€ãããŒãªããžã§ã¯ãã§ããããŒã¹ãã¢ãããã³['2ql3g5ae6pcwstt9'] ['o6tnzx1xskf39pb9ã¯ããŒãžã£ãæ ŒçŽãããªããžã§ã¯ã
{ value: '' }
2çªç®ã®åŒæ°ãšããŠã å€ãå€æŽãããå Žåã¯ãå€ã眮ãæããŸããããªããžã§ã¯ãã¯ä»¥åãšåãããã«ã¯ããŒãžã£ãŒå ã«æ®ããŸãã
ãã¹ãŠã®ããŒã¯ãObject.getOwnPropertyNamesããåé€ãããŸã§ãããããæå³ã§é衚瀺ã«ãªããŸããããã«ãããã³ãŒãå ã«ååšããçãã®ãªããã»ãšãã©ååšããªãããŒãåŸãããŸãããããã¯ãã€ãã¬ãŒã¿ã«ãªã¹ãããããã¯ãšãªã
çµæãšããŠãç°¡åã«å€æŽã§ããåžžã«ããŒã§åé€ãããã³ã³ãã³ããå«ãã³ã³ãããéãããã®ããŒãåããå®å šã«å®å šãªïŒã³ãŒãå ã®å€æŽãªãã®ã¢ã¯ã»ã¹ã¯äžå¯èœã§ãïŒIE9 + WeakMapsã®å®è£ ãååŸããŸãã OïŒ1ïŒã®è€éããããã³å±æ§ãèšå®å¯èœãªObject.definePropertyã«ããæžã蟌ã¿äžå¯ããã³åé€äžå¯ãã¢ã¯ã»ã¹ããŒã§æ§æå¯èœïŒfalseãåæå¯èœïŒfalseãæžã蟌ã¿å¯èœïŒfalseïŒããã©ã«ãã§èšå®ïŒã
ãã¡ãããããŒã®å±æ§ãäœæããããšããäºå®ã¯å¥œãã§ã¯ãããŸããããã©ã®ãœãªã¥ãŒã·ã§ã³ãããããçæ³çãã¯ããããŸããã ãã©ã³ãã³ãèšæ¶ãæ±ãçŽ æŽãããä»äºãããæ¬çªã§äœ¿çšãã¹ã決å®ãäžããããšãèªããã ãã§ãã
ã³ã¡ã³ãã§ãç¹ã«Harmonyã³ã¬ã¯ã·ã§ã³ãšç¹ã«WeakMapãåŒãç¶ã䜿çšã§ããçç±ãããã³åæ§ã®APIå šè¬ã«å¯Ÿããæ 床ã«ã€ããŠæèŠãèãããšãã§ããŸãã
UPDã ãã©ã³ãã³ã¯ãïŒ0ãevalïŒïŒ 'this'ïŒãæåŸã«è¡ãããçç±ã説æããŸããã ïŒ0ãevalïŒïŒ "this"ïŒã¯ãvar e = evalãšã»ãŒåçã§ãã eïŒããããïŒã å®éãevalã¯åžžã«ããŒã«ã«é åã§æ©èœããŸãããevalãå¥ã®å€æ°ã«å²ãåœãŠãŠå®è¡ãããšãã°ããŒãã«ç°å¢ã§å®è¡ãããŸãã