DEV Community

Sheldon Nunes
Sheldon Nunes

Posted on Edited on

Mini Quiz: Javascript Scoping

A quick quiz question on javascript scoping. Try and figure this out before executing in browser

If you were to create this object:

var person = {
    name: 'Dave',
    weight: 100,
    height: 180,
    calculateBMI: function() {
        console.log(this);
        function innerFunction() {
            console.log(this);
        }
        innerFunction();
    }
}

When running person.calculateBMI() what object will this be mapped to when logged by the innerFunction?

Top comments (6)

Collapse
 
lexlohr profile image
Alex Lohr • • Edited

Depends on whether you 1) fix the code (you're missing a comma after the height and a closing } at the end) and 2) don't have "use strict" before the code (in which case this is set to undefined until explicitly set by call/apply or in prototypal methods); then the first console.log will show the person and the second one window/global (depending on your JS runtime).

Collapse
 
sheldonnunes profile image
Sheldon Nunes • • Edited

Well spotted on the code error. Was not intentional and have since updated it :P

Collapse
 
avalander profile image
Avalander •

Trick question, it won't run because it will throw a SyntaxError when parsing the code, so this won't be mapped to anything :P

Collapse
 
bakertx profile image
Aaron Baker •

The calculateBMI method this mapping to the person object makes sense to me, but the innerFunction mapping to the Window object was a surprise. Anybody care to explain?

Collapse
 
equiman profile image
Camilo Martinez •

Because innerFunction have another different scope. Then this inside reference to function and not to person.

You can solve it adding self:

var person = {
    name: 'Dave',
    weight: 100,
    height: 180,
    calculateBMI: function() {
        console.log(this);
        var self = this;
        function innerFunction() {
            console.log(self);
        }
        innerFunction();
    }
}

Or with arrow function:

var person = {
    name: 'Dave',
    weight: 100,
    height: 180,
    calculateBMI: function() {
        console.log(this);
        let innerFunction = () => {
            console.log(this);
        }
        innerFunction();
    }
}
Collapse
 
theoutlander profile image
Nick Karnik •

It is going to return window all the time