@@ -306,7 +306,13 @@ export class DOMEvent implements Event {
306
306
// the static method named `removeEventListener` on the target's class
307
307
// allows us to be robust to the possiblity of the case of the target
308
308
// overriding it (however unlikely).
309
- const removeGlobalEventListener = ( target . constructor as unknown as typeof target ) . removeEventListener . bind ( target . constructor ) as Observable [ 'removeEventListener' ] ;
309
+ //
310
+ // Rather than eagerly binding the context to the function right here,
311
+ // we pass the function along with its context to handleEvent() to allow
312
+ // binding only once needed - doing this for each of the
313
+ // removeEventListener callbacks saves 100 nanoseconds per dispatchTo()
314
+ // call.
315
+ const removeGlobalEventListener = ( target . constructor as unknown as typeof target ) . removeEventListener as Observable [ 'removeEventListener' ] ;
310
316
311
317
// Global event handlers are a NativeScript-only concept, so we'll not
312
318
// try to add new formal event phases for them (as that could break DOM
@@ -326,7 +332,7 @@ export class DOMEvent implements Event {
326
332
// possible.
327
333
328
334
this . listenersLazyCopy = this . listenersLive = getGlobalEventHandlersPreHandling ?.( ) || emptyArray ;
329
- this . handleEvent ( data , true , this . CAPTURING_PHASE , removeGlobalEventListener ) ;
335
+ this . handleEvent ( data , true , this . CAPTURING_PHASE , removeGlobalEventListener , target . constructor ) ;
330
336
331
337
const eventPath = this . getEventPath ( target , 'capture' ) ;
332
338
@@ -339,7 +345,7 @@ export class DOMEvent implements Event {
339
345
this . eventPhase = this . target === this . currentTarget ? this . AT_TARGET : this . CAPTURING_PHASE ;
340
346
341
347
this . listenersLazyCopy = this . listenersLive = currentTarget . getEventList ( this . type ) || emptyArray ;
342
- this . handleEvent ( data , false , this . CAPTURING_PHASE , currentTarget . removeEventListener . bind ( currentTarget ) as Observable [ 'removeEventListener' ] ) ;
348
+ this . handleEvent ( data , false , this . CAPTURING_PHASE , currentTarget . removeEventListener , currentTarget ) ;
343
349
344
350
if ( this . propagationState !== EventPropagationState . resume ) {
345
351
this . resetForRedispatch ( ) ;
@@ -354,7 +360,7 @@ export class DOMEvent implements Event {
354
360
this . eventPhase = this . target === this . currentTarget ? this . AT_TARGET : this . BUBBLING_PHASE ;
355
361
356
362
this . listenersLazyCopy = this . listenersLive = currentTarget . getEventList ( this . type ) || emptyArray ;
357
- this . handleEvent ( data , false , this . BUBBLING_PHASE , currentTarget . removeEventListener . bind ( currentTarget ) as Observable [ 'removeEventListener' ] ) ;
363
+ this . handleEvent ( data , false , this . BUBBLING_PHASE , currentTarget . removeEventListener , currentTarget ) ;
358
364
359
365
if ( this . propagationState !== EventPropagationState . resume ) {
360
366
this . resetForRedispatch ( ) ;
@@ -375,15 +381,15 @@ export class DOMEvent implements Event {
375
381
}
376
382
377
383
this . listenersLazyCopy = this . listenersLive = getGlobalEventHandlersPostHandling ?.( ) || emptyArray ;
378
- this . handleEvent ( data , true , this . BUBBLING_PHASE , removeGlobalEventListener ) ;
384
+ this . handleEvent ( data , true , this . BUBBLING_PHASE , removeGlobalEventListener , target . constructor ) ;
379
385
380
386
this . resetForRedispatch ( ) ;
381
387
return ! this . defaultPrevented ;
382
388
}
383
389
384
390
// Taking multiple params instead of a single property bag saves 250
385
391
// nanoseconds per dispatchTo() call.
386
- private handleEvent ( data : EventData , isGlobal : boolean , phase : 0 | 1 | 2 | 3 , removeEventListener : ( eventName : string , callback ?: any , thisArg ?: any , capture ?: boolean ) => void ) {
392
+ private handleEvent ( data : EventData , isGlobal : boolean , phase : 0 | 1 | 2 | 3 , removeEventListener : ( eventName : string , callback ?: any , thisArg ?: any , capture ?: boolean ) => void , removeEventListenerContext : unknown ) {
387
393
// Set a listener to clone the array just before any mutations.
388
394
this . listenersLive . onMutation = this . onCurrentListenersMutation . bind ( this ) ;
389
395
@@ -416,7 +422,7 @@ export class DOMEvent implements Event {
416
422
}
417
423
418
424
if ( once ) {
419
- removeEventListener ( this . type , callback , thisArg , capture ) ;
425
+ removeEventListener . call ( removeEventListenerContext , this . type , callback , thisArg , capture ) ;
420
426
}
421
427
422
428
// Consistent with the original implementation, we only apply
0 commit comments