Console.log output [function] when foregoing second variable declaration


I'm confused by something happening in Introduction to Objects II | 25. Private Methods

I have successfully completed this exercise, but something seems very strange to me.
In the code displayed below I have commented out the given lines

var myBalanceMethod = john.askTeller();
var myBalance = myBalanceMethod();

and replaced them with

var myBalance = john.askTeller();

Which, in my eyes, is exactly the same thing but saves a line of code.

Yet, when I run this code I get an error that reads 'Oops, try again. It looks like myBalance doesn't have the correct value! Make sure that askTeller returns the method itself and that you have not modified the provided code.'

and my console reads:


What's causing this, why is there a separate line for myBalanceMethod in the code provided with the exercise? I don't see a functional difference in the code but I'm obviously missing something.

The full code from the exercise as I have it:

function Person(first,last,age) {
   this.firstname = first;
   this.lastname = last;
   this.age = age;
   var bankBalance = 7500;
   var returnBalance = function() {
      return bankBalance;
   // create the new function here
   this.askTeller = function() {
       return returnBalance;

var john = new Person('John','Smith',30);
// var myBalanceMethod = john.askTeller();
// var myBalance = myBalanceMethod();
var myBalance = john.askTeller();


Replace your last code-line with

console.log(myBalance.toString() );

maybe you understand.....


Thanks for your reply. I already understood that the console isn't logging the output of the function, but the function itself.

What I don't understand is why the declaration of the 2 variables in the supplied code is causing this, could you explain?



++ 1/2 ++ 25/30 bankbalance explained
What they are trying to make clear,
is that after calling the public-accessable askTeller method

you still don't have the actual value of the property-key -bankBalance

because the askTeller-function returns the name of a function

this function must be executed and then you get the Value of bankBalance.

A two-step approach, as you have to execute-twice.

As the () sign means execute, you could also get the result by using

console.log( john.askTeller()() );

++ 2/2 +++ 25/30 bankbalance explained
1 You have to create a so-called public askTeller Method...
meaning you have to use the this-keyword and NOT the var-keyword

2 the askTeller Method should return returnBalance
and NOT as you are doing returning the bankBalance

= = = = = = = = = = = = = = = = = = = =

Here is the wording of the it once more....

Private Methods

Why did that code in [24] work ?
An object's private variables
can only be accessed by other methods
that are part of that same object.

So, in [24] we just used an object's public method
to access a private variable!

Methods can also be private within a class and inaccessible outside of the class. Changing
from the last exercise to
var returnBalance
makes this method private.

If you run the program trying to access the method
you would get an undefined error this time.

The way to access a private method
is similar to accessing a private variable.

You must create a public method for the class, using the this-keyword
that returns the private method.


Create a method called askTeller within the Person class
that returns the returnBalance method.

This means that it returns the method itself
and NOT the result of calling that method.
So you should NOT have parentheses after returnBalance.

Because askTeller returns a method,
we need to call it to make it any use.
This is what var myBalance = myBalanceMethod(); does.


Your method should resemble how we defined getBalance last time—
you should use
this.askTeller = function() { }.

Don't declare askTeller with var.

You return method the same way
that you would return simple variables.
Be careful not to call the method though
and leave out parentheses in your return statement!


Ah! I understand now, I'm declaring variables by executing a function with the supplied code.

What I changed skips a function execution, thanks!