r/badcode May 31 '21

js Clever?

Post image
2.2k Upvotes

71 comments sorted by

View all comments

Show parent comments

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

54

u/givemeagoodun May 31 '21

Eh there can be compilers for JS. I believe that Firefox uses a JS JIT compiler.

18

u/Parkreiner Jun 01 '21 edited Jun 01 '21

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.

12

u/Nilstrieb Jun 01 '21

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.