Oh. I think I understand.

removeEventListener needs to reference the same function as addEventListener 
which needs to be unique to an instance but match on subsequent checks.

That’s what I was missing.

Never mind, and sorry for the noise… ;-)

Although, I wonder if there’s some way we can optimize “one time” event 
listeners…

Harbs

> On Jan 5, 2022, at 7:15 PM, Harbs <harbs.li...@gmail.com> wrote:
> 
> FWIW, I think the reason the goog version is so complicated is because it 
> supports partially applying arguments when you first use goog.bind (which is 
> not something we’re doing).
> 
> But I definitely would like to hear why it’s important for two bound methods 
> to be equivalent. I’m probably missing something, but I can’t see where it 
> would matter.
> 
> Caching the closure seems like it just adds bulk to instances and make an app 
> use more memory.
> 
> Probably the most common use case of Language.closure is for event listeners. 
> If the event listener is transient, it can be cleaned up by garbage 
> collection. If it’s cached to the instance, it’ll live for the life of the 
> instance. Seems like a down-side to me.
> 
> Harbs
> 
>> On Jan 5, 2022, at 6:37 PM, Harbs <harbs.li...@gmail.com 
>> <mailto:harbs.li...@gmail.com>> wrote:
>> 
>> On normal modern systems it’s roughly quivalent to this:
>> 
>> function(fn, selfObj, var_args){
>>      return /** @type {!Function} */ (fn.call.apply(fn.bind, arguments));
>> }.apply(null,arguments);
>> 
>> 
>> Here’s the code:
>> 
>> goog.bindNative_ = function(fn, selfObj, var_args) {
>>   return /** @type {!Function} */ (fn.call.apply(fn.bind, arguments));
>> };
>> 
>> goog.bind = function(fn, selfObj, var_args) {
>>   // TODO(nicksantos): narrow the type signature.
>>   if (Function.prototype.bind &&
>>       // NOTE(nicksantos): Somebody pulled base.js into the default Chrome
>>       // extension environment. This means that for Chrome extensions, they 
>> get
>>       // the implementation of Function.prototype.bind that calls goog.bind
>>       // instead of the native one. Even worse, we don't want to introduce a
>>       // circular dependency between goog.bind and Function.prototype.bind, 
>> so
>>       // we have to hack this to make sure it works correctly.
>>       Function.prototype.bind.toString().indexOf('native code') != -1) {
>>     goog.bind = goog.bindNative_;
>>   } else {
>>     goog.bind = goog.bindJs_;
>>   }
>>   return goog.bind.apply(null, arguments);
>> };
>> 
>> Not sure why you’d want to use two applies and one bind instead of a single 
>> apply in:
>> 
>> return function() {
>>    return fn.apply(object, arguments);
>>  };
>> 
>>> Did you test this with your chsnges:
>>> 
>>> var f1:Function = myInst.method;
>>> var f2:Function = myInst.method;
>>> 
>>> trace(f1 == f2)
>> 
>> 
>> No I didn’t. You’re right that will likely fail. But why is that important?
>> 
>> Thanks,
>> Harbs
>> 
>>> On Jan 5, 2022, at 5:00 PM, Greg Dove <greg.d...@gmail.com 
>>> <mailto:greg.d...@gmail.com>> wrote:
>>> 
>>> I would assume that goog.bind would be optimized by gcc if it can be
>>> (perhaps it is inlined if it uses es5 function.protoype.bind internally- I
>>> did not look inside it)
>>> 
>>> The function naming/caching in Language.closure is important, including
>>> private naming conventions when they are needed for closures.
>>> 
>>> Did you test this with your chsnges:
>>> 
>>> var f1:Function = myInst.method;
>>> var f2:Function = myInst.method;
>>> 
>>> trace(f1 == f2)
>> 
> 

Reply via email to