<div dir="ltr">Hi,<div><br></div><div>This already has a Stage 0 proposal here:</div><div><a href="https://github.com/tc39/proposal-bind-operator">https://github.com/tc39/proposal-bind-operator</a>.</div><div><br></div><div>You can find all proposals at <a href="https://github.com/tc39/proposals">https://github.com/tc39/proposals</a> in (currently) three categories: That page itself, which lists proposals for Stages 1, 2, and 3; and the linked lists of Stage 0 proposals, Inactive proposals, and Finished proposals.<br></div><div><br></div><div>-- T.J. Crowder</div><div class="gmail_extra"><div><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div><div><br></div></div></div></div></div></div></div></div></div></div></div></div>
<br><div class="gmail_quote">On Sun, Feb 4, 2018 at 4:32 PM, Ludwig GUERIN <span dir="ltr"><<a href="mailto:ludwig.guerin.98@gmx.fr" target="_blank">ludwig.guerin.98@gmx.fr</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div style="font-family:Verdana;font-size:12px"><div>
<p>Sometimes, you need to pass a callback as a parameter of a function.</p>

<p>Sometimes, you would like to pass in a method as the said parameter but you may encounter the common issue that the <code>this</code> keyword is not bound to the correct context anymore ; therefore you need to bind the correct context.</p>

<p> </p>

<p>Let's says that you have :</p>

<ul>
        <li>a function `<code>f</code>` which receives a callback</li>
        <li>
        <p>and an object `<code>obj</code>` which has a method `<code>method</code>` which requires the `<code>this</code>` keyword to be bound to `<code>obj</code>` in order to work properly as intended.</p>

        <p> </p>
        </li>
</ul>

<p>You will probably call `<code>f</code>` this way :</p>

<p>`f(obj.method.bind(obj));`</p>

<p> </p>

<p>This is perfectly fine but sometimes can lead to a very large amount of extra "effort" for something that should not require that much "effort" and tends to take away a lot of space and clarity :<code>`</code></p>

<p>`f(obj.prop.method.bind(obj.<wbr>prop));`</p>

<p> </p>

<p>My suggestion to solve this issue would be to use a new notation based around what C++ developers call the <em>scope resolution operator</em>, aka <code>`::`</code>.</p>

<p>Here are details on how this should work :</p>

<ul>
        <li>
        <p><code>`{object}`</code> refers to an object (it can be either <code>obj</code>, or <code>obj.method</code>, or <code>obj.prop</code>, etc...)</p>
        </li>
        <li>
        <p><code>`{method}`</code> refers to one of <code>`{object}`</code>'s methods (if <code>`{object}`</code> is <code>obj</code> and we have <code>`obj.method`</code> then <code>`{method}`</code> would be <code>`method`</code>)</p>
        </li>
        <li>
        <p>The "old-fashioned" way would look like <code>`{object}.{method}.bind({<wbr>object})`</code></p>
        </li>
        <li>
        <p>With this suggestion, it would look like <code>`{object}::{method}`</code></p>
        </li>
</ul>

<p> </p>

<p>One way to implement such a functionality would be to establish a function <code>autoBindContext</code> which would guarantee the following properties :</p>

<ul>
        <li>
        <p><code>`{object}::{method}`</code> <=> `<code>autoBindContext({object}.{<wbr>method}, {object})</code>`</p>
        </li>
        <li>
        <p>Given any function/method `<code>{fn}</code>` (either `<code>f</code>` or `<code>obj.method</code>`), `<code>autoBindContext({fn}, null) === {fn}</code>`</p>
        </li>
        <li>
        <p>`<code>{object}::{method}</code>` <=> `<code>({object})::{method}</code>`</p>
        </li>
        <li>
        <div>const a = {object}::{method}; <br>
        const b = {object}::{method}; </div>

        <div>a==b; //is true <br>
        a===b; //is true </div>
        </li>
</ul>

<p> </p>

<p>Below is one implementation of <code>autoBindContext</code> :</p>

<p>```javascript</p>

<pre lang="javascript">const autoBindContext = (method, context=null) => {
  if(typeof method !== "function")
    throw new TypeError("Can only bind the context of a function/method");
  
  if(context === null)
    return method; //Do not bind if the context is null
    
  if(!(context instanceof Object))
    throw new TypeError("Can only bind a function's/method's context to an object");
    
  const self = autoBindContext;
  if(!self.cache.hasBinding(<wbr>method, context))
    self.cache.addBinding(method, context);
    
  return self.cache.getBinding(method, context);
}

autoBindContext.cache = {
  /****************************<wbr>*******\
    binding: {context, method, bound}
  \*****************************<wbr>******/
    bindings: [],
  lookForBinding(method, context=null){
    return this.bindings.find(binding => {
      return binding.context === context
      && binding.method === method;
    });
  },
  hasBinding(method, context=null){
    return this.lookForBinding(method, context) !== undefined;
  },
  getBound(method, context=null){
    if(this.hasBinding(method, context))
        return this.lookForBinding(method, context).bound;
    
    return null;
  },
  getBinding(method, context=null){
    return this.getBound(method, context);
  },
  addBinding(method, context=null){
    if(!this.hasBinding(method, context)){
      this.bindings.push({
        context,
        method,
        bound: method.bind(context)
      });
    }
    
    return this;
  }
};</pre>

<p>```</p>
</div></div></div>
<br>______________________________<wbr>_________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/<wbr>listinfo/es-discuss</a><br>
<br></blockquote></div><br></div></div>