JavaScript: Scopes

JavaScript: Scopes

Some of the most fundamental concepts of JavaScript are hoisting, self-executing function blocks, closures, and scopes. They helps us understand how JavaScript relate variables and methods given a block of code. Learning how they work helps us write bug-free, controlled coding. I never been to an interview without a question from these concepts.

In the following series of posts, we will look at them in detail starting with this post about scopes.  

Scopes 🔭

Scopes are, availability of variables or methods to your block of code. Your block of code could be an if condition, for loop, function or simply global. Let's get to coding,

console.log(this); // prints window object

when you try typing the above code on your browser's developer console, it will print a big Window object, or on Node.js it will print a big global object. This is called the Global Scope. You can write your own variable on the global scope, which will obviously be available on all your if conditions, for loops and functions no matter how deep they go. It also exposes your variable to all third party libraries if you include them in the global scope.

var foo = "hello world";
console.log(window.foo); // prints hello world

The second type of scope is called Local Scope. Local scopes are variables available within your function. Let's have a look,

var foo = "Hello";

function america() {
	var bar = "Howdy";
	console.log(foo); // prints Hello
	console.log(bar); // prints Howdy
}

console.log(bar); // *Error: bar is not defined*
console.log(foo); // Prints Hello

america(); // Function declared on global scope, so the function is available globally

As you can see the variable bar is only available within america() method and not  globally.

The last type of scope is called Block Scope. Block scopes are only available on ES6, so you can use it on the latest Node.js but not widely supported by all browsers.

The secret recipe to write block scope variables in JavaScript is by declaring a variable with let keyword instead of var. Let's take our america() method and implement a block scope.

function america() {
	var bar = "Howdy";
 	if (bar === "Howdy") {
		let baz = "YeeHaw!"; // Notice let keyword
        
		console.log(baz); // prints YeeHaw!
		console.log(bar); // prints 
	}
    
	console.log(baz); // *Error: baz is not defined*
}
america();

Notice how variable baz declared with let is only available within the parentheses {} of  if condition. So variables declared with let encapsulates itself to whichever parentheses {} based code block. It could be for, while, switch, function, etc.

If you declare variable baz with keyword var, something special happens with JavaScript. The output on the last console.log will be undefined instead of not defined error. This special case is called variable "Hoisting". Which we can cover on another post.

These are three types of scopes in JavaScript. Understanding them will enable you to write bug-free code, control what to expose where, and generally become a better developer.

Show Comments