1.2. Analyzing JavaScript
JavaScript is built on some very good ideas and a few very bad ones.
The very good ideas include functions, loose typing, dynamic objects, and an expressive object literal
notation. The bad ideas include a programming model based on global variables.
JavaScript's functions are first class objects with (mostly) lexical scoping. JavaScript is the first lambda
language to go mainstream. Deep down, JavaScript has more in common with Lisp and Scheme than with
Java. It is Lisp in C's clothing. This makes JavaScript a remarkably powerful language.
The fashion in most programming languages today demands strong typing. The theory is that strong typing
allows a compiler to detect a large class of errors at compile time. The sooner we can detect and repair errors,
the less they cost us. JavaScript is a loosely typed language, so JavaScript compilers are unable to detect type
errors. This can be alarming to people who are coming to JavaScript from strongly typed languages. But it
turns out that strong typing does not eliminate the need for careful testing. And I have found in my work that
the sorts of errors that strong type checking finds are not the errors I worry about. On the other hand, I find
loose typing to be liberating. I don't need to form complex class hierarchies. And I never have to cast or
wrestle with the type system to get the behavior that I want.
JavaScript has a very powerful object literal notation. Objects can be created simply by listing their
components. This notation was the inspiration for JSON, the popular data interchange format. (There will be
more about JSON in Appendix E.)
A controversial feature in JavaScript is prototypal inheritance. JavaScript has a class-free object system in
which objects inherit properties directly from other objects. This is really powerful, but it is unfamiliar to
classically trained programmers. If you attempt to apply classical design patterns directly to JavaScript, you
will be frustrated. But if you learn to work with JavaScript's prototypal nature, your efforts will be rewarded.
JavaScript is much maligned for its choice of key ideas. For the most part, though, those choices were good, if
unusual. But there was one choice that was particularly bad: JavaScript depends on global variables for
linkage. All of the top-level variables of all compilation units are tossed together in a common namespace
called the global object. This is a bad thing because global variables are evil, and in JavaScript they are
fundamental. Fortunately, as we will see, JavaScript also gives us the tools to mitigate this problem.
In a few cases, we can't ignore the bad parts. There are some unavoidable awful parts, which will be called out
as they occur. They will also be summarized in Appendix A. But we will succeed in avoiding most of the bad
parts in this book, summarizing much of what was left out in Appendix B. If you want to learn more about the
bad parts and how to use them badly, consult any other JavaScript book.
The standard that defines JavaScript (aka JScript) is the third edition of The ECMAScript Programming
Language, which is available from
http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf. The language described in this
book is a proper subset of ECMAScript. This book does not describe the whole language because it leaves out
the bad parts. The treatment here is not exhaustive. It avoids the edge cases. You should, too. There is danger
and misery at the edges.
Appendix C describes a programming tool called JSLint, a JavaScript parser that can analyze a JavaScript
program and report on the bad parts that it contains. JSLint provides a degree of rigor that is generally lacking
in JavaScript development. It can give you confidence that your programs contain only the good parts.
JavaScript is a language of many contrasts. It contains many errors and sharp edges, so you might wonder,
"Why should I use JavaScript?" There are two answers. The first is that you don't have a choice. The Web has
become an important platform for application development, and JavaScript is the only language that is found
1
1