Volunteers needed: Function.prototype.bind() in ES3.1 pseudo-code

Garrett Smith dhtmlkitchen at gmail.com
Thu Sep 18 10:41:11 PDT 2008


2008/9/18 Mark S. Miller <erights at google.com>:
> The Redmond mtg is fast approaching. We'd like to put out an official
> for-Redmond-mtg draft of the ES3.1 spec by then. I had volunteered to write
> the spec for Function.prototype.bind(). Long term, I think we all agree we'd
> like to see this spec and many others self-hosted in EcmaScript. However,
> the discussion of self-hosting issues makes clear that this ain't gonna
> happen in time for ES3.1.
>
> So what we need now is a spec for Function.prototype.bind() in the peculiar
> pseudo-code style -- combining the worst of COBOL and assembly language --

What pseudo-code style? This:

Function.prototype.bind( context, [ preArg1 [, preArg1 [,...]]])

?

> used in the rest of the spec. Unfortunately, I won't have time between now
> and then. Would anyone care to contribute some text? Please?
>

I'm not sure exactly what you're looking for so I've typed only a
little. Is this in the right direction:-

================================================
Function.prototype.bind( context, [ preArg1 [, preArg1 [,...]]])

Returns a function that invokes this function. The |context| argument
determines the execution context of the returned function. Arguments
1..n are used for values of parameter variables to this function.

Example:
var brendan = { name : "Brendan" };
function sayHelloTo(name) {
  return "Hi " + name + ", my name is " + this.name + ".";
}

brendansGreeting = sayHelloTo.bind(brendan);

brendansGreeting("Mark");

returns
"Hi Mark, my name is Brendan."

Methods |Function.prototype.call| and |Function.prototype.apply| do
not affect the |this| value of a bound function. Thus:

brendansGreeting.call(null, "Mark");

returns
"Hi Mark, my name is Brendan."

[insert_algorithm_steps_here]

The |length| property of Function.prototype.bind is 1.

================================================
A self-hosted version:
/**
 * @param {Object} context the |this| value to be used.
 * @param {arguments} [1..n] optional arguments that are
 * prepended to returned function's call.
 * @return {Function} a function that uses |context| as the this
 * value for the returned function and arguments 1..n for values
 * of parameter variables to this function.
 */
Function.prototype.bind = function(context) {
  var fn = this,
      ap, concat, args,
      isPartial = arguments.length > 1;
  // Strategy 1: just bind, not a partialApply
  if(!isPartial) {
    return function() {
        if(arguments.length !== 0) {
          return fn.apply(context, arguments);
        } else {
          return fn.call(context); // faster in Firefox.
        }
      };
    } else {
    // Strategy 2: partialApply
    ap = Array.prototype,
    args = ap.slice.call(arguments, 1);
    concat = ap.concat;
    return function() {
      return fn.apply(context,
        arguments.length === 0 ? args :
        concat.apply(args, arguments));
    };
  }
};
================================================

?

Garrett

> --
>    Cheers,
>    --MarkM
>
> _______________________________________________
> Es-discuss mailing list
> Es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
>


More information about the Es-discuss mailing list