<div>On Thu, Apr 29, 2010 at 12:25 AM, Alex Russell <span dir="ltr">&lt;<a href="mailto:alex@dojotoolkit.org">alex@dojotoolkit.org</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
 node.addEventListener(&quot;click&quot;, bang(obj, &quot;method&quot;));<br> // works!<br> node.removeEventListener(&quot;click&quot;, bang(obj, &quot;method&quot;));<br></blockquote></div></div><div><br></div>On Thu, Apr 29, 2010 at 10:42 AM, Tom Van Cutsem <span dir="ltr">&lt;<a href="mailto:tomvc@google.com">tomvc@google.com</a>&gt;</span> wrote:<br>
<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="gmail_quote"><div>node.addEventListener(&quot;click&quot;, bind(obj).method );</div>
<div>node.removeEventListener(&quot;click&quot;, bind(obj).method );</div><div></div></div></blockquote></div><div><br></div><div>Both techniques cache the bound method, in order to preserve identity, so that the above examples work.</div>
<div><br></div><div>When caching, one should always worry about cache invalidation. Say that obj inherits from Foo.prototype and that both examples are thereby caching Foo.prototype.method as bound to obj. Neither Alex nor Tom are first verifying that Foo.prototype.method is a non-writable, non-configurable data property, and so neither are justified in assuming its value may not change. Between the two statements above, what happens if</div>
<div><br></div><div>    Foo.prototype.method = function(){ /* some other function */ };</div><div><br></div><div>? Because Alex&#39;s cache is indexed by the identity of obj and by the name &quot;method&quot;, bang will return a stale result and the removeEventListener will succeed when it shouldn&#39;t. Because Tom&#39;s cache is indexed by the identity of obj and the identity of the function being bound, the removeEventListener will properly fail.</div>
<meta charset="utf-8"><meta charset="utf-8"><meta charset="utf-8"><div><br></div>I verbally verified with Tom just now that he hadn&#39;t thought about this cache invalidation issue at all. I think this corroborates that the EphemeronTable-based technique is more robust -- it did the right thing for the right reasons even for cases that weren&#39;t thought about at the time. (Of course, no matter how robust the patterns being used, please *always* think about cache invalidation when designing a cache of any kind.)<br>
<br clear="all"><br>-- <br>    Cheers,<br>    --MarkM<br>