Writing an Interpreter in Go
This book walks you through the creation of an interpreter for an imaginary programming language. It is very basic, and syntactially looks similar to your more basic scripting languages.
It helped me gain an even deeper understanding of various javascript concepts that I had previously considered myself to have understood well. Things like closures and higher order functions become much clearer and seem almost natural when you have implemented them. It walks through the creation of a lexer to convert programs into tokens, a parser to create the abstract syntaxs tree, and an evaluator that traverses the tree to return a result.