Puzzle: JS Function that returns itself until there are no arguments

后端 未结 5 2069
北荒
北荒 2020-12-06 14:29

I\'m trying to solve a puzzle, and am at my wit\'s end trying to figure it out.

I\'m supposed to make a function that works like this:

add(1);                


        
5条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-06 14:37

    Thanks for the tip on valueOf(). This is what works:

    function add(n) {
        var calc = function(x) {
            return add(n + x);
        }
    
        calc.valueOf = function() {
            return n;   
        }
    
        return calc;
    }
    

    --edit--

    Could you please explain how this works? Thanks!

    I don't know if I know the correct vocabulary to describe exactly how it works, but I'll attempt to:

    Example statement: add(1)(1)

    When add(1) is called, a reference to calc is returned.

    1. calc understands what n is because, in the "mind" of the interpreter, calc is a function child of add. When calc looks for n and doesn't find it locally, it searches up the scope chain and finds n.

    2. So when calc(1) is called, it returns add(n + x). Remember, calc knows what n is, and x is simply the current argument (1). The addition is actually done inside of calc, so it returns add(2) at this point, which in turn returns another reference to calc.

    Step 2 can repeats every time we have another argument (i.e. (x)).

    • When there aren't any arguments left, we are left with just a definition of calc. The last calc is never actually called, because you need a () to call a function. At this point, normally the interpreter would return a the function object of calc. But since I overrode calc.valueOf it runs that function instead.

    • When calc.valueOf runs, it finds the most recent instance of n in the scope chain, which is the cumulative value of all previous n's.

    I hope that made some sense. I just saw @RobG 's explanation, which is admittedly much better than mine. Read that one if you're confused.

提交回复
热议问题