Wolfgaung
Wolfgaung

Reputation: 53

JavaScript function that returns function with parameters

I'm doing the tutorials for functional programming on the nodeschool-homepage. I'm new to JS (came from Java) so I don't get some aspects of JS, for example:

function say(word) {
   return function(anotherWord) {
        console.log(anotherWord);
    }
}

If I call:

say("hi"); // it returns nothing

say("hi", "hi"); // it returns nothing

var said = say("hi"); // asignment

said("hi"); // returns hi -- but why?

said(); // returns undefined;

Can someone explain to me how the "hi" in the outer function is passed in the inner function?

Upvotes: 0

Views: 146

Answers (3)

Odi
Odi

Reputation: 6916

The function say takes one parameter word which is not used anywhere, so nothing is passed from the "outer" function to the "inner" function.

function say(word) {
    return function(anotherWord) {
        console.log(anotherWord);
    };
}

What happens is, that say() returns a function. This returned function takes one parameter (anotherWord), which is output to the console when called.

Now to your code samples:

say("hi"); // this returns a function, but you don't keep it anywhere

say("hi", "hi"); // still returns a function, still no variable to keep it

var said = say("hi"); // finally the returned function is saved, the param is not used

said("hi"); // this prints "hi", because you pass it 'hi'

said("foobar"); // this prints "foobar", because you pass it 'foobar'

said(); // This prints undefined, as you did not pass any parameter

Upvotes: 0

Felix Kling
Felix Kling

Reputation: 816364

said("hi"); // returns hi -- but why?

Because the inner function is defined as

function(anotherWord) {
    console.log(anotherWord);
}

This means it logs the first argument it gets passed. You are passing 'hi', so it logs 'hi'.

how t.. f... the "hi" in the outer function is passed in the inner function?

It isn't. The inner function only accesses its own argument. It doesn't matter what you pass as argument to the first function. say()('hi'), say('foo')('hi') are all equivalent. What matters is the argument passed to the second function.

If instead you defined the function as

function say(word) {
   return function(anotherWord) {
        console.log(word, anotherWord);
    }
}

Now the inner function also accesses the first argument of the outer function, so you would get different results.

Why does this work? Because all functions in JS are closures and so they have access to variable bindings in higher scopes.

Upvotes: 2

Jacob Mattison
Jacob Mattison

Reputation: 51052

The function say returns a function that takes a parameter and logs it. The parameter passed to the say function (the parameter word) is discarded.

The instance of your code that appears to work is the following:

var said = say("hi");
said("hi");

When you call the the say function in the first line here, the word "hi" that you pass in does nothing. That function returns another, anonymous function which is stored in the said variable.

When you call the function in the said variable and pass in "hi", it operates as expected. It would work exactly the same way if the first line was

var said = say("elephant");

Upvotes: 0

Related Questions