On Thu, Apr 29, 2010 at 11:51 AM, Mark S. Miller <[email protected]> wrote:
> On Thu, Apr 29, 2010 at 12:25 AM, Alex Russell <[email protected]> wrote:
>>
>>  node.addEventListener("click", bang(obj, "method"));
>>  // works!
>>  node.removeEventListener("click", bang(obj, "method"));
>
> On Thu, Apr 29, 2010 at 10:42 AM, Tom Van Cutsem <[email protected]> wrote:
>>
>> node.addEventListener("click", bind(obj).method );
>> node.removeEventListener("click", bind(obj).method );
>
> Both techniques cache the bound method, in order to preserve identity, so
> that the above examples work.
> 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
>     Foo.prototype.method = function(){ /* some other function */ };
> ? Because Alex's cache is indexed by the identity of obj and by the name
> "method", bang will return a stale result and the removeEventListener will
> succeed when it shouldn't. Because Tom's cache is indexed by the identity of
> obj and the identity of the function being bound, the removeEventListener
> will properly fail.
> I verbally verified with Tom just now that he hadn'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'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.)

I'm arguing for a syntax, not a particular implementation. The one I
provided was only to illustrate (briefly, if that's at all possible)
how such a thing might work. The *last* thing I want is an actual
bang() or bind() method to be carted around the network in source
form. That's the failure I'd like us to finally start avoiding.
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to