Eloquent JavaScript 3rd Edition Marijn Haverbeke - The ebook is available for quick download, easy access to content
Eloquent JavaScript 3rd Edition Marijn Haverbeke - The ebook is available for quick download, easy access to content
or textbooks at https://ebookultra.com
_____ Follow the link below to get your download now _____
https://ebookultra.com/download/eloquent-javascript-3rd-
edition-marijn-haverbeke/
https://ebookultra.com/download/eloquent-javascript-a-modern-
introduction-to-programming-1st-edition-marijn-haverbeke/
https://ebookultra.com/download/eloquent-javascript-a-modern-
introduction-to-programming-2nd-edition-marijn-haverbeke/
https://ebookultra.com/download/beginning-javascript-3rd-ed-edition-
paul-wilton/
https://ebookultra.com/download/javascript-a-beginner-s-guide-3rd-ed-
edition-pollock/
JavaScript jQuery The Missing Manual 3rd Edition David
Sawyer Mcfarland
https://ebookultra.com/download/javascript-jquery-the-missing-
manual-3rd-edition-david-sawyer-mcfarland/
https://ebookultra.com/download/professional-javascript-for-web-
developers-3rd-edition-nicholas-c-zakas/
https://ebookultra.com/download/special-edition-using-javascript-
mcfedries/
https://ebookultra.com/download/pro-javascript-with-mootools-learning-
advanced-javascript-programming-1st-edition-mark-joseph-obcena-auth/
https://ebookultra.com/download/javascript-creativity-exploring-the-
modern-capabilities-of-javascript-and-html5-1st-ed-edition-hudson/
Eloquent JavaScript 3rd Edition Marijn Haverbeke
Digital Instant Download
Author(s): Marijn Haverbeke
ISBN(s): 9781593279509, 1593279507
Edition: 3
File Details: PDF, 2.16 MB
Year: 2018
Language: english
Eloquent JavaScript
3rd edition
Marijn Haverbeke
Copyright © 2018 by Marijn Haverbeke
You can buy a print version of this book, with an extra bonus chapter included,
printed by No Starch Press at http://a-fwd.com/com=marijhaver-20&asin-
com=1593279507.
i
Contents
Introduction 1
On programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Why language matters . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
What is JavaScript? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Code, and what to do with it . . . . . . . . . . . . . . . . . . . . . . . 7
Overview of this book . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Typographic conventions . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2 Program Structure 22
Expressions and statements . . . . . . . . . . . . . . . . . . . . . . . . 22
Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Binding names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
The environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
The console.log function . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Return values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Control flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Conditional execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
while and do loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Indenting Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
for loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Breaking Out of a Loop . . . . . . . . . . . . . . . . . . . . . . . . . . 33
ii
Updating bindings succinctly . . . . . . . . . . . . . . . . . . . . . . . 34
Dispatching on a value with switch . . . . . . . . . . . . . . . . . . . . 34
Capitalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3 Functions 39
Defining a function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Bindings and scopes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Functions as values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Declaration notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Arrow functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
The call stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Optional Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Closure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Growing functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Functions and side effects . . . . . . . . . . . . . . . . . . . . . . . . . 54
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
iii
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5 Higher-Order Functions 82
Abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Abstracting repetition . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Higher-order functions . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Script data set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Filtering arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Transforming with map . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Summarizing with reduce . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Composability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Strings and character codes . . . . . . . . . . . . . . . . . . . . . . . . 91
Recognizing text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
iv
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
10 Modules 167
Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
v
Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Improvised modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Evaluating data as code . . . . . . . . . . . . . . . . . . . . . . . . . . 170
CommonJS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
ECMAScript modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Building and bundling . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Module design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
vi
HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
HTML and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
In the sandbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Compatibility and the browser wars . . . . . . . . . . . . . . . . . . . 222
vii
16 Project: A Platform Game 261
The game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
The technology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Reading a level . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Actors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Encapsulation as a burden . . . . . . . . . . . . . . . . . . . . . . . . . 268
Drawing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Motion and collision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Actor updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Tracking keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Running the game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
viii
The form as a whole . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Text fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Checkboxes and radio buttons . . . . . . . . . . . . . . . . . . . . . . . 321
Select fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
File fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Storing data client-side . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
20 Node.js 350
Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
The node command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Installing with NPM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
The file system module . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
The HTTP module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
A file server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
ix
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
x
“We think we are creating the system for our own purposes. We
believe we are making it in our own image... But the computer is
not really like us. It is a projection of a very slim part of ourselves:
that portion devoted to logic, order, rule, and clarity.”
—Ellen Ullman, Close to the Machine: Technophilia and its
Discontents
Introduction
This is a book about instructing computers. Computers are about as common
as screwdrivers today, but they are quite a bit more complex, and making them
do what you want them to do isn’t always easy.
If the task you have for your computer is a common, well-understood one,
such as showing you your email or acting like a calculator, you can open the
appropriate application and get to work. But for unique or open-ended tasks,
there probably is no application.
That is where programming may come in. Programming is the act of con-
structing a program—a set of precise instructions telling a computer what to do.
Because computers are dumb, pedantic beasts, programming is fundamentally
tedious and frustrating.
Fortunately, if you can get over that fact, and maybe even enjoy the rigor
of thinking in terms that dumb machines can deal with, programming can be
rewarding. It allows you to do things in seconds that would take forever by
hand. It is a way to make your computer tool do things that it couldn’t do
before. And it provides a wonderful exercise in abstract thinking.
Most programming is done with programming languages. A programming
language is an artificially constructed language used to instruct computers. It
is interesting that the most effective way we’ve found to communicate with a
computer borrows so heavily from the way we communicate with each other.
Like human languages, computer languages allow words and phrases to be
combined in new ways, making it possible to express ever new concepts.
At one point language-based interfaces, such as the BASIC and DOS prompts
of the 1980s and 1990s, were the main method of interacting with computers.
They have largely been replaced with visual interfaces, which are easier to learn
but offer less freedom. Computer languages are still there, if you know where
to look. One such language, JavaScript, is built into every modern web browser
and is thus available on almost every device.
This book will try to make you familiar enough with this language to do
useful and amusing things with it.
1
On programming
Besides explaining JavaScript, I will introduce the basic principles of program-
ming. Programming, it turns out, is hard. The fundamental rules are simple
and clear, but programs built on top of these rules tend to become complex
enough to introduce their own rules and complexity. You’re building your own
maze, in a way, and you might just get lost in it.
There will be times when reading this book feels terribly frustrating. If you
are new to programming, there will be a lot of new material to digest. Much of
this material will then be combined in ways that require you to make additional
connections.
It is up to you to make the necessary effort. When you are struggling to follow
the book, do not jump to any conclusions about your own capabilities. You are
fine—you just need to keep at it. Take a break, reread some material, and make
sure you read and understand the example programs and exercises. Learning is
hard work, but everything you learn is yours and will make subsequent learning
easier.
2
art of programming is the skill of controlling complexity. The great program
is subdued—made simple in its complexity.
Some programmers believe that this complexity is best managed by using
only a small set of well-understood techniques in their programs. They have
composed strict rules (“best practices”) prescribing the form programs should
have and carefully stay within their safe little zone.
This is not only boring, it is ineffective. New problems often require new
solutions. The field of programming is young and still developing rapidly, and
it is varied enough to have room for wildly different approaches. There are
many terrible mistakes to make in program design, and you should go ahead
and make them so that you understand them. A sense of what a good program
looks like is developed in practice, not learned from a list of rules.
That is a program to add the numbers from 1 to 10 together and print out
the result: 1 + 2 + ... + 10 = 55. It could run on a simple, hypothetical
machine. To program early computers, it was necessary to set large arrays of
switches in the right position or punch holes in strips of cardboard and feed
them to the computer. You can probably imagine how tedious and error-prone
this procedure was. Even writing simple programs required much cleverness
and discipline. Complex ones were nearly inconceivable.
Of course, manually entering these arcane patterns of bits (the ones and
zeros) did give the programmer a profound sense of being a mighty wizard.
And that has to be worth something in terms of job satisfaction.
Each line of the previous program contains a single instruction. It could be
written in English like this:
3
Exploring the Variety of Random
Documents with Different Content
goblin should call next day, and make him laugh, or else die by slow
boiling. This the goblin heard with a mixture of scorn and
amusement, curling his nose and showing his teeth in an aristocratic
manner.
As the cunning Gigag left the king’s chamber to go to his quarters
in a corner of the great palace, he took good care to scatter about
two scientifically-prepared powders, one of which dissolved in the
air, producing sleep, and the other by a similar change entered the
nostrils, producing throughout the body tickling sensations and a
disposition to low chuckling. When Gigag again came before
Googloom, it was seen that none of the royal guards were fit for
duty, and that throughout the palace and its grounds the disposition
among courtiers, retainers, servants, pages, to laugh in their sleeves
at the smallest incitement, was unmistakable. Even the kitchen cats
had caught the infection, and mewed dispersedly.
“Now, O great Googloom!” said Gigag when all the court had
assembled, “let me in three acts essay to complete that
transformation by which thy people’s despair shall be turned to joy,
and thy laughing face shall behold its own merriment.” At this
moment the giant shook like one who is tickled all over, but cannot
laugh, experiencing the greatest tortures without knowing what to
make of them. To divert him the goblin related his favorite story of
the merry owl, with such catcalls, crowing, mincing, and mewing,
and withal such unearthly jest, that a thousand dogs would have
died if they did not laugh. What wonder, then, that long before the
witty Gigag had concluded a favorite page was so wrought upon by
chuckling that, bursting his buttons, at length he laughed right out,
which had such an effect upon all assembled that they chuckled, and
then roared. “Ho, guards!” cried Googloom; but Gigag easily drew
his attention to the second part of the programme—for the goblin
had actually brought the giant to the point of complacency. “I
propose now,” he said, “to show you the most ridiculous
countenance that was ever seen, except one.” Hereupon he
diminished and heightened his figure at intervals, while he curved
his nose by degrees, lengthened his teeth as he pleased, and put
upon his mouth such an expression of maddening humor that his
spectators gasped with laughing, to the vast confusion of the
helpless giant, who vowed with a feeble smile that the gifted Gigag
was certainly the most ingenious man he ever knew.
“Nothing will serve you, I perceive, O beautiful Googloom! except
the light of science; and now I will show you the face of the most
ridiculous man that ever was born.” Accordingly, by means of an
instrument which he had invented, Gigag reflected upon a large
canvas the features of Googloom! Unwittingly the giant smiled, for
he had never seen so preposterous a face before; and the more he
smiled, the more ridiculous it grew, till at last, after the giant himself
had given way to laughter, it was so horribly funny that the whole
court shrieked and shrieked again, and Googloom, losing all control,
roared with such a volume and power of merriment that he toppled
off his throne, and was crushed under its ruins. The people, seeing
the faces of the courtiers and of each other, caught an infectious
laughter, which prevailed throughout all Odom, and did not by any
means cease when the goblin Gigag was called to the throne, and
the reign of science began.
NEW PUBLICATIONS.
Les Droits de Dieu et les Idees Modernes. Par l’Abbé
François Chesnel, Vicaire-Général de Quimper.
Poitiers et Paris: Henri Oudin. 1875.
Every age has its special errors and its special manifestations of
the truth precisely opposite to those errors. The special errors of the
present age may be well summed up under one formula, which we
find on p. 335 of the Abbé Chesnel’s work bearing the title placed at
the head of this notice: “The pretended incompetence of God and
his representatives in the order of human things, whether scientific
or social.” The system which springs from this fundamental notion
has received the name of Liberalism. In contradiction to it, the
authority of God and the church over those matters which are
included in the order of human things, is the truth which in our day
has been the special object of inculcation, definition, explanation,
and defence on the part of the Catholic Church and her most
enlightened advocates. A great number of the very finest
productions of our contemporary Catholic writers in books,
pamphlets, and periodicals, treat of themes and topics connected
with this branch of the great controversy between Catholic truth and
universal error. The volume just published by the Abbé Chesnel is
particularly remarkable among these for simplicity, lucidity, and
moderation in its statements, and for its adaptation to the
understanding of the great mass of intelligent and educated readers,
who are unable to profit by any treatises presupposing a great
amount of knowledge and thought on abstruse matters. The form of
dialogue helps the author and the reader very much in respect to
the facility and simplicity of the work of giving and receiving
elementary instruction on the subjects contained within the volume.
The other topics besides the particular one we are about to mention
are handled very much in the same manner by M. Chesnel as by
other sound and able writers, and require no special remark. Thank
God! our instructed American Catholics are not inclined to bury
themselves in what the author happily styles “the fog of liberalism,”
in so far as this confuses the view of the rights of the church and the
Holy See in respect to the usurpations of the civil power and the
rebellions of private judgment. We have turned with a more
particular interest to that part of the volume which treats of the
nature, origin, acquisition, and loss of sovereign rights by the
possessors of political power in the state. This is one of the most
difficult topics in the department of ethics, and one seldom handled,
in our opinion, so well as by our author. To a certain extent sound
Catholic writers agree, and the principles maintained are proved with
ease to the satisfaction of right-minded students. That political
power is from God, that human rights are from God, that an
authority certainly legitimate cannot be resisted within its lawful
domain without sin, are so many first principles universally accepted
and easily proved. But when the sources and criteria of legitimacy
are in question, there is far less agreement even among those who
reject liberalism, and much less facility of laying down and proving
propositions in a satisfactory manner. The ingenious and learned Dr.
Laing, in his little book entitled Whence do Kings Derive the Right to
Rule? in our opinion sustains most extravagant theories regarding
the divine right of monarchs. On the other hand, we are not entirely
satisfied with the reasonings of the very able and brilliant Dublin
Reviewer on the principles of legitimacy. In fact, we have not seen
the subject handled in a perfectly thorough and satisfactory manner
by any author writing in the English language. M. Chesnel is not
exhaustive, but, so far as his scope in writing permits him to develop
his subject, he seems to us remarkably clear and judicious. The
beginning of sovereignty he traces to the parental expanding into
the patriarchal authority. Acquisition of lawful sovereignty he refers
to inheritance, election, and just conquest. The rehabilitation of a
sovereignty unjustly acquired he refers to the accession of the right
of a nation to the possession of the goods which have become
dependent on the peaceable maintenance of a de facto sovereignty,
sanctioned by a common consent. The possessor who has been
unjustly despoiled of his sovereignty de jure by one who has become
sovereign de facto evidently loses his right as soon as it is
transferred lawfully to this spoliator or his heirs in the manner
indicated. The author, as we think unnecessarily, resorts to the
supposition that he is supposed to cede it, because he cannot
reasonably maintain it. He adds, however, that if he does not cede it
he nevertheless loses it, which seems to us to make his cession or
non-cession wholly irrelevant and without effect. It is lost by the
prevalence of a higher right on the part of the nation. Nevertheless,
we think that until a permanent and stable union of the welfare of
the nation with the right of the new dynasty is effected, the former
sovereign right may in certain cases remain in abeyance, and
therefore revive again in the future. This appears to us to be
exemplified in the case of the rights of Don Carlos to the throne of
Spain, and of the Comte de Chambord to the throne of France.
Strictly, in themselves, their rights have been in abeyance, and
remain imperfect, until the national welfare, sustained by a sound
and powerful part of the body politic, demands their restitution and
actually effects the same. In such cases there is always more or less
doubt about the real sense of the better and sounder part of the
nation, and about the best settlement of conflicting claims for the
common good. And hence it is that the best men may differ, and
conscientiously espouse opposite sides, when a nation is in an
unsettled and divided state respecting its sovereignty.
In respect to the relation of the state to the church, the author
has some very just and sagacious remarks on the peculiar condition
of things in our own republic, quite in accordance with the views
which have been expressed by our soundest American Catholic
writers. We conclude our criticism by quoting a few passages:
“The religious system existing in the United States does not
resemble, either in its origin or in its applications, that which the
liberal sect imposes on the Catholic peoples of Europe. The American
population, the progeny of colonists driven from England by
persecution, never possessed religious unity. When Presbyterians,
Episcopalians, and Catholics, who had all fought in common for
independence, assembled in Congress and formed their constitution,
they recognized the variety of worships as an antecedent fact, and
endeavored to accommodate themselves to it in the best way they
could. No false political theory disturbed the good sense of these
legislators. Governed by a necessity manifestly invincible, and which
still continues, they secured to each worship a complete liberty;
proclaimed that which is a just consequence from this principle: that
the state should have only a very restricted agency—that is, no more
than what is necessary for reconciling the liberty of each one with
that of all others. In fact, when separated from the true church, the
state is reduced to pure naturalism, and in this condition the action
of the state, separated from the church, ought to be reduced to the
minimum” (p. 179).
[85]
“Like a wight,
Who haply from Croatia wends to see
Our Veronica and the while ’tis shown,
Hangs over it with never-sated gaze,
And, all that he hath heard revolving, saith
Unto himself in thought: ‘And didst thou look
E’en thus, O Jesus, my true Lord and God?
And was this semblance thine?’”
—Cary’s Translation.
[101]
Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.
ebookultra.com