Functions and assignment precedence question

Discussion in 'Javascript' started by Uncle Roastie, Sep 2, 2011.

  1. var decoratedFib = function fib(n) {
    return decoratedFib(n-1) + decoratedFib(n-2);

    My question:
    Does "decoratedFib" get assigned "function fib" or
    the result of executing "function decorate"?
    Uncle Roastie, Sep 2, 2011
    1. Advertisements

  2. If you mean the result of calling a 'decorate' method of the function
    object created by the preceding expression (and assuming one of the
    Function or Object prototypes has a 'decorate' method) then the value
    assigned to - decoratedFib - is the return value from the call to that

    Richard Cornford, Sep 2, 2011
    1. Advertisements

  3. Uncle Roastie

    Scott Sauyet Guest

    Richard Cornford's answer is correct, but it's not as clear as his
    prose usually is.

    If you look at Javascript's operator precedence ([1]), you might note
    that the member operator (".") binds well before the assignment
    operator ("="), so anything of this form:

    var z = x.y()

    will assign to `z` the value of calling the function assigned to the
    property `y` of the object `x` in the context of `x`. The fact that
    in this case `x` is a function doesn't change that.

    So your `decoratedFib` variable will be assigned the result of the
    call to `decorate` performed on the named anonymous (!!) function.
    The only way that will work is if `decorate` has been added to the
    prototype chain of the anonymous function, that is, if it's on
    Function.prototype (or possibly Object.prototype).

    If decorate looked like this:

    Function.prototype.decorate= function() {
    var cache = {}, self = this;
    return function(n) {
    return (n in cache) ? cache[n] : (cache[n] = self(n));

    then you would have a new Fibonacci function that memoized the
    results, calculating larger ones much more quickly than the
    undecorated version. Of course, then `decorate` should probably be
    renamed `memoize`. (Note too that this is not a general-purpose
    memoization function. It only works for unary functions of numbers or
    strings. It's not hard to build a more general-purpose one, but it's
    outside the scope of this discussion.

    -- Scott

    [1] One good source is
    Scott Sauyet, Sep 6, 2011
  4. In comp.lang.javascript message <[email protected]>, Tue, 6 Sep 2011 05:24:36, Scott Sauyet
    I have a couple of other examples where cacheing helps (with less subtle
    code) at <>.
    Dr J R Stockton, Sep 7, 2011
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.