nameAndSelfBind function

useful for making event listeners self-aware, including the ability to remove themselves

by SSRRDD

JavaScript

(function()
{
  // an optional constant to store references to all named and bound functions:
  const arrayOfFormerlyAnonymousFunctions = [],
        removeEventListenerAfterDelay = 3000; // an auxiliary variable for setTimeout
  
  // this function both names argument function and makes it self-aware,
  // binding it to itself; useful e.g. for event listeners which then will be able
  // self-remove from within an anonymous functions they use as callbacks:
  function nameAndSelfBind(functionToNameAndSelfBind,
                           name = 'namedAndBoundFunction', // optional
                           outerScopeReference)            // optional
  {
    var namedAndBoundFunction;
    if (!functionToNameAndSelfBind.name)
    {
      const functionAsObject = {
                                  [name]()
                                  {
                                    return binder(...arguments);
                                  }
                               };
      namedAndBoundFunction = functionAsObject[name];

      // if no arbitrary-naming functionality is required, then the constants above are
      // not needed, and the following function should be just "var namedAndBoundFunction = ":
      var binder = function() 
      { 
        return functionToNameAndSelfBind.bind(namedAndBoundFunction, ...arguments)();
      }
    }
    else
    {
      namedAndBoundFunction = functionToNameAndSelfBind;
    }
    
    // this optional functionality allows to assign the function to a outer scope variable
    // if can not be done otherwise; useful for example for the ability to remove event
    // listeners from the outer scope:
    if (typeof outerScopeReference !== 'undefined')
    {
      if (outerScopeReference instanceof Array)
      {
        outerScopeReference.push(namedAndBoundFunction);
      }
      else
      {
        outerScopeReference = namedAndBoundFunction;
      }
    }
    return namedAndBoundFunction;
  }
  
  // removeEventListener...