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);
    }.decorate({...});


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

  2. On Sep 2, 4:43 pm, Uncle Roastie wrote:
    > var decoratedFib = function fib(n) {
    > return decoratedFib(n-1) + decoratedFib(n-2);
    >
    > }.decorate({...});
    >
    > My question:
    > Does "decoratedFib" get assigned "function fib"


    No.

    > or
    > the result of executing "function decorate"?


    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
    method.

    Richard.
    Richard Cornford, Sep 2, 2011
    #2
    1. Advertising

  3. Uncle Roastie

    Scott Sauyet Guest

    Uncle Roastie wrote:
    > var decoratedFib = function fib(n) {
    >     return decoratedFib(n-1) + decoratedFib(n-2);
    >
    > }.decorate({...});
    >
    > My question:
    > Does "decoratedFib" get assigned "function fib" or
    > the result of executing "function decorate"?


    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 https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence
    Scott Sauyet, Sep 6, 2011
    #3
  4. In comp.lang.javascript message <06defdf6-cb61-42b3-8e26-524e673f7ff1@t3
    g2000vbe.googlegroups.com>, Tue, 6 Sep 2011 05:24:36, Scott Sauyet
    <> posted:

    >
    >then you would have a new Fibonacci function that memoized the
    >results, calculating larger ones much more quickly than the
    >undecorated version.


    I have a couple of other examples where cacheing helps (with less subtle
    code) at <http://www.merlyn.demon.co.uk/js-misc0.htm#Cash>.

    --
    (c) John Stockton, nr London UK. ?@merlyn.demon.co.uk IE8 FF3 Op12 Sf5 Cr12
    news:comp.lang.javascript FAQ <http://www.jibbering.com/faq/index.html>.
    <http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
    <http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.
    Dr J R Stockton, Sep 7, 2011
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Andrew Koenig
    Replies:
    10
    Views:
    542
    Ron Natalie
    Jul 14, 2003
  2. maadhuu
    Replies:
    3
    Views:
    352
    maadhuu
    Jul 29, 2005
  3. Replies:
    0
    Views:
    256
  4. Daniel DeLorme

    operator precedence of assignment

    Daniel DeLorme, Jan 2, 2007, in forum: Ruby
    Replies:
    1
    Views:
    109
    Phrogz
    Jan 2, 2007
  5. matt neuburg
    Replies:
    7
    Views:
    107
    matt neuburg
    May 8, 2008
Loading...

Share This Page