Why was block scope not originally implemented in JavaScript?
Converting my comment to answer
Choice of the creator: I tweeted Brendan and got the following answer:
@mplungjan 10 days did not leave time for block scope. Also many "scripting languages" of that mid-90s era had few scopes & grew more later.
That said, here are some relevant points:
- Block statement
Important: JavaScript prior to ECMAScript2015 (6th edition) does not have block scope. Variables introduced within a block are scoped to the containing function or script, and the effects of setting them persist beyond the block itself. In other words, block statements do not introduce a scope. Although "standalone" blocks are valid syntax, you do not want to use standalone blocks in JavaScript, because they don't do what you think they do, if you think they do anything like such blocks in C or Java.
- a workaround
we can artificially introduce scopes by creating new functions and immediately invoking them
- ECMAScript 2015 (ES6)
let
and const
declared variables are hoisted but they are not initialized to undefined
in the same way var
is. Hence, referencing a let
or const
declared variable before its value is assigned raises a ReferenceError.
Redeclaration of the same variable in the same block scope raises a SyntaxError.
Block scope was not implemented for the following reasons:
- It's makes the language easier to implement. JavaScript was initially designed as a language for writing interactive web applications. Hence it needed to be small and easy to implement.
- Block scopes introduce a performance hit to dynamic languages like JavaScript. This is because when you try to access some variable which is not in the current scope JavaScript first checks the current scope, then the parent scope and so on until it either finds the variable or reaches the end. Hence the introduction of block scopes would make variable access in loops and nested loops very slow.
- The lack of block scopes makes it easier to write programs. For example say you want to create a variable only if a certain condition is true. All you need to do in JavaScript is declare and define the variable within an
if
statement. In languages like C you would have to declare the variable outside theif
statement and define it within theif
statement. - The lack of block scopes allow declarations to be hoisted. This is especially useful in the case of function declarations. For example see this fiddle: http://jsfiddle.net/L6SgM/ (note however that this example doesn't work in Firefox).
- Since JavaScript supports first-class function expressions we don't need block scopes. They can be simulated using immediately invoked function expressions.
New answer as of 2015. ES6 does have block scope for variable definitions with the let
and const
keywords.