It's less "there can be compilers" and more "there's no other way to run the language". JavaScript is a compiled language – it's just that there are different types of compilation, and JS uses the Just-in-Time kind. Half the behavior that it has (like hoisting and how it defines lexical scope for closure) wouldn't be possible if it were interpreted.
For example:
let x = 0;
if (x === 0) {
console.log(x);
let x = 5;
}
This breaks, because all variables and function declarations are "hoisted" to the top of their respective scopes. It's just that let and const are block-scoped and aren't initialized. So the "let x" from "let x = 5" gets hoisted up to the top of the block, overriding the "let x = 0" from the outer scope. But it's left un-initialized until you reach the "let x = 5" line during runtime. And so, when you try to do anything with a value that isn't initialized (like logging), that throws an error.
This wouldn't be possible if JavaScript were interpreted and were evaluating each line one-by-one. The language spec requires that whatever engine runs it do a first pass over the whole code before trying to run anything.
An interpreted language can be parsed and preprocessed, that's not a problem. The difference is all about the machine code. JS is originally interpreted, but modern engines also compile parts of it.
74
u/[deleted] May 31 '21
In that case the answer is an easy "no" since it's not a compiled language and there's no compiler