Javascript Deep Introduction
Javascript Deep Introduction
Javascript Deep Introduction
Not to be confused with Java (programming language), Java (software platform), or Javanese script.
JavaScript
Paradigm
Designed by
Brendan Eich
Developer
First appeared
Stable release
Major implementations
Chakra, SpiderMonkey, V8
Influenced by
Influenced
JavaScript at Wikibooks
JavaScript
.js
Filename extension
Internet
media type
Uniform Type
application/javascript
text/javascript (obsolete)[3]
com.netscape.javascript-source[4]
Identifier (UTI)
Type of format
Scripting language
Part of a series on
JavaScript
JavaScript syntax
JavaScript library
Unobtrusive JavaScript
JavaScript engine
Ajax frameworks
ECMAScript
Webcontent production; the majority of websites employ it and it is supported by all modern Web
browsers without plug-ins.[6] JavaScript isprototype-based with first-class functions, making it a multiparadigm language, supporting object-oriented,[8] imperative, and functionalprogramming styles.[6] It
has an API for working with text, arrays, dates and regular expressions, but does not include
any I/O, such as networking, storage, or graphics facilities, relying for these upon the host
environment in which it is embedded.[7]
Despite some naming, syntactic, and standard library similarities, JavaScript and Java are otherwise
unrelated and have very differentsemantics. The syntax of JavaScript is actually derived from C,
while the semantics and design are influenced by the Self and Schemeprogramming languages.[9]
JavaScript is also used in environments that are not Web-based, such as PDF documents, sitespecific browsers, and desktop widgets. Newer and faster JavaScript virtual machines (VMs) and
platforms built upon them have also increased the popularity of JavaScript for server-side Web
applications. On the client side, JavaScript has been traditionally implemented as
an interpreted language, but more recent browsers perform just-in-time compilation. It is also used in
game development, the creation of desktop and mobile applications, and server-side network
programming with runtime environments such as Node.js.
Contents
[hide]
1History
o 1.1Beginnings at Netscape
o 1.2Server-side JavaScript
o 1.3Adoption by Microsoft
o 1.4Standardization
o 1.5Later developments
2Trademark
3Features
o 3.1Imperative and structured
o 3.2Dynamic
o 3.3Prototype-based (Object-oriented)
o 3.4Functional
o 3.5Delegative
o 3.6Miscellaneous
o 3.7Vendor-specific extensions
4Syntax
o 4.1Simple examples
o 4.2More advanced example
5Use in Web pages
o 5.1Example script
o 5.2Compatibility considerations
6Security
o 6.1Cross-site vulnerabilities
6.1.1Misplaced trust in the client
6.1.2Browser and plugin coding errors
6.1.3Sandbox implementation errors
7Uses outside Web pages
o 7.1Embedded scripting language
o 7.2Scripting engine
o 7.3Application platform
8Development tools
9Version history
10Related languages and features
o 10.1Use as an intermediate language
o 10.2JavaScript and Java
11References
12Further reading
13External links
History[edit]
Beginnings at Netscape[edit]
JavaScript was originally developed in 10 days in May 1995 by Brendan Eich, while he was working
for Netscape Communications Corporation. Indeed, while competing withMicrosoft for user adoption
of Web technologies and platforms, Netscape considered their client-server offering a distributed OS
with a portable version of Sun Microsystems's Java providing an environment in which applets could
be run.[citation needed] Because Java was a competitor of C++ and aimed at professional programmers,
Netscape also wanted a lightweight interpreted language that would complement Java by appealing
to nonprofessional programmers, like Microsoft's Visual Basic (see JavaScript and Java).[10]
Although it was developed under the name Mocha, the language was officially
called LiveScript when it first shipped in beta releases of Netscape Navigator 2.0 in September
1995, but it was renamed JavaScript[11] when it was deployed in the Netscape browser version
2.0B3.[12]
The change of name from LiveScript to JavaScript roughly coincided with Netscape adding support
for Java technology in its Netscape Navigator Web browser. The final choice of name caused
confusion, giving the impression that the language was a spin-off of the Java programming
language, and the choice has been characterized as a marketing ploy by Netscape to give
JavaScript the cachet of what was then the hot new Web programming language.[13][14]
There is a common misconception that the JavaScript language was influenced by an earlier Web
page scripting language developed by Nombas named C-- (not to be confused with the later C- created in 1997).[15][16][17] Brendan Eich, however, had never heard of C-- before he created
LiveScript.[18] Nombas did pitch their embedded Web page scripting to Netscape, though Web page
scripting was not a new concept, as shown by ViolaWWW.[19] Nombas later switched to offering
JavaScript instead of C-- in their ScriptEase product and was part of the TC39 group that
standardized ECMAScript.[20][21]
Server-side JavaScript[edit]
Netscape introduced an implementation of the language for server-side scripting with Netscape
Enterprise Server in December, 1995, soon after releasing JavaScript for browsers.[22][23] Since the
mid-2000s, there has been a resurgence of server-side JavaScript implementations, such
as Node.js.[24][25]
Adoption by Microsoft[edit]
Microsoft Windows script technologies including VBScript and JScript were released in 1996.
JScript, a reverse-engineered implementation of Netscape's JavaScript, was released on July 16,
1996 and was part of Internet Explorer 3, as well as being available server-side in Internet
Information Server. IE3 also included Microsoft's first support for Cascading Style Sheets and
various extensions to HTML, but in each case the implementation was noticeably different to that
found in Netscape Navigator at the time.[26][27] These differences made it difficult for designers and
programmers to make a single website work well in both browsers leading to the use of 'best viewed
in Netscape' and 'best viewed in Internet Explorer' logos that characterised these early years of
the browser wars.[28] JavaScript began to acquire a reputation for being one of the roadblocks to a
cross-platform and standards-driven Web. Some developers took on the difficult task of trying to
make their sites work in both major browsers, but many could not afford the time.[26] With the release
ofInternet Explorer 4, Microsoft introduced the concept of Dynamic HTML, but the differences in
language implementations and the different and proprietary Document Object Modelsremained, and
were obstacles to widespread take-up of JavaScript on the Web.[26]
Standardization[edit]
In November 1996, Netscape announced that it had submitted JavaScript to Ecma International for
consideration as an industry standard, and subsequent work resulted in the standardized version
named ECMAScript. In June 1997, Ecma International published the first edition of the ECMA262 specification. In June 1998, some modifications were made to adapt it to the ISO/IEC-16262
standard, and the second edition was released. The third edition of ECMA-262 was published on
December 1999.[29]
Development of the fourth edition of the ECMAScript standard was never completed.[30] The fifth
edition was released in December 2009. The current edition of the ECMAScript standard is 6,
released in June 2015.[31]
Later developments[edit]
JavaScript has become one of the most popular programming languages on the Web. Initially,
however, many professional programmers denigrated the language because its target audience
consisted of Web authors and other such "amateurs", among other reasons.[32] The advent
of Ajax returned JavaScript to the spotlight and brought more professional programming attention.
The result was a proliferation of comprehensive frameworks and libraries, improved JavaScript
programming practices, and increased usage of JavaScript outside Web browsers, as seen by the
proliferation of server-side JavaScript platforms.
In January 2009, the CommonJS project was founded with the goal of specifying a common
standard library mainly for JavaScript development outside the browser.[33]
With the rise of the single-page application and JavaScript-heavy sites, it is increasingly being used
as a compile target for source-to-source compilers from both dynamic languagesand static
languages. In particular, Emscripten and highly optimized JIT compilers, in tandem with asm.js that
is friendly to ahead-of-time compilers (AOT) like OdinMonkey, have enabled C and C++ programs to
be compiled into JavaScript and execute at near-native speeds, causing JavaScript to be considered
the "assembly language of the Web",[34]according to its creator and others.
Trademark[edit]
"JavaScript" is a trademark of Oracle Corporation.[35] It is used under license for technology invented
and implemented by Netscape Communications and current entities such as theMozilla
Foundation.[36]
Features[edit]
The following features are common to all conforming ECMAScript implementations, unless explicitly
specified otherwise.
adds a let keyword for block scoping, meaning JavaScript now has both function and block
scoping. Like C, JavaScript makes a distinction between expressions and statements. One syntactic
difference from C is automatic semicolon insertion, which allows the semicolons that would normally
terminate statements to be omitted.[37]
Dynamic[edit]
Typing
As with most scripting languages, JavaScript is dynamically typed; a type is associated with
each value, rather than just with each expression. For example, a variable that is at one time
bound to a number may later be re-bound to a string.[38] JavaScript supports various ways to
test the type of an object, including duck typing.[39]
Run-time evaluation
JavaScript includes an eval function that can execute statements provided as strings at runtime.
Prototype-based (Object-oriented)[edit]
JavaScript is almost entirely object-based. In JavaScript, an object is an associative array,
augmented with a prototype (see below); each string key provides the name for an object
property, and there are two syntactical ways to specify such a name: dot notation
(obj.x = 10) and bracket notation (obj['x'] = 10). A property may be added, rebound,
or deleted at run-time. Most properties of an object (and any property that belongs to an
object's prototype inheritance chain) can be enumerated using a for...in loop.
JavaScript has a small number of built-in objects, including Function and Date.
Prototypes
JavaScript uses prototypes where many other object-oriented languages
use classes for inheritance.[40] It is possible to simulate many class-based features with
prototypes in JavaScript.[41]
Functions as object constructors
Functions double as object constructors along with their typical role. Prefixing a function call
with new will create an instance of a prototype, inheriting properties and methods from the
constructor (including properties from the Object prototype).[42] ECMAScript 5 offers
the Object.create method, allowing explicit creation of an instance without automatically
inheriting from the Object prototype (older environments can assign the prototype
to null).[43] The constructor's prototype property determines the object used for the new
object's internal prototype. New methods can be added by modifying the prototype of the
function used as a constructor. JavaScript's built-in constructors, such asArray or Object,
also have prototypes that can be modified. While it is possible to modify
the Object prototype, it is generally considered bad practice because most objects in
JavaScript will inherit methods and properties from the Object prototype and they may not
expect the prototype to be modified.[44]
Functions as methods
Unlike many object-oriented languages, there is no distinction between a function definition
and a method definition. Rather, the distinction occurs during function calling; when a
function is called as a method of an object, the function's local this keyword is bound to that
object for that invocation.
Functional[edit]
A function is first-class; a function is considered to be an object. As such, a
function may have properties and methods, such
as .call() and .bind().[45] A nested function is a function defined within
another function. It is created each time the outer function is invoked. In
addition, each nested function forms a lexical closure: The lexical scope of the
outer function (including any constant, local variable, or argument value)
becomes part of the internal state of each inner function object, even after
execution of the outer function concludes.[46] JavaScript also
supports anonymous functions.
Delegative[edit]
JavaScript supports implicit and explicit delegation.
Functions as Roles (Traits and Mixins)
JavaScript natively supports various function-based implementations of Role[47] patterns
like Traits[48][49] and Mixins.[50] Such a function defines additional behavior by at least one
method bound to the this keyword within its function body. A Role then has to be
delegated explicitly via call or apply to objects that need to feature additional behavior that
is not shared via the prototype chain.
Object Composition and Inheritance
Whereas explicit function-based delegation does cover composition in JavaScript, implicit
delegation already happens every time the prototype chain is walked in order to, e.g., find a
method that might be related to but is not directly owned by an object. Once the method is
found it gets called within this object's context. Thus inheritance in JavaScript is covered by a
delegation automatism that is bound to the prototype property of constructor functions.
Miscellaneous[edit]
Run-time environment
JavaScript typically relies on a run-time environment (e.g., a Web browser) to provide objects
and methods by which scripts can interact with the environment (e.g., a webpage DOM). It
also relies on the run-time environment to provide the ability to include/import scripts
(e.g., HTML <script> elements). This is not a language feature per se, but it is common in
most JavaScript implementations.
JavaScript processes messages from a queue one at a time. Upon loading a new message,
JavaScript calls a function associated with that message, which creates a call stackframe
(the function's arguments and local variables). The call stack shrinks and grows based on
the function's needs. Upon function completion, when the stack is empty, JavaScript
proceeds to the next message in the queue. This is called the event loop, described as "run
to completion" because each message is fully processed before the next message is
considered. However, the language's concurrency model describes the event loop as nonblocking: program input/output is performed using events and callback functions. This
means, for instance, that JavaScript can process a mouse click while waiting for a database
query to return information.[51]
Variadic functions
An indefinite number of parameters can be passed to a function. The function can access
them through formal parameters and also through the local arguments object. Variadic
functions can also be created by using the bind method.
Array and object literals
Like many scripting languages, arrays and objects (associative arrays in other languages)
can each be created with a succinct shortcut syntax. In fact, these literals form the basis of
the JSON data format.
Regular expressions
JavaScript also supports regular expressions in a manner similar to Perl, which provide a
concise and powerful syntax for text manipulation that is more sophisticated than the built-in
string functions.[52]
Vendor-specific extensions[edit]
Syntax[edit]
Main article: JavaScript syntax
Simple examples[edit]
Variables in JavaScript can be defined using
the var keyword:[56]
var x; // defines the variable x, the
special value undefined (not to be
confused with an undefined value) is
assigned to it by default
var y = 2; // defines the variable y
and assigns the value of 2 to it
semicolons
^^^^
are
LCMCalculator.prototype = { // object
literal
constructor: LCMCalculator, // when
reassigning a prototype, set the
constructor property appropriately
gcd: function () { // method that
calculates the greatest common divisor
// Euclidean algorithm:
var a = Math.abs(this.a), b =
Math.abs(this.b), t;
if (a < b) {
// swap variables
t = b;
b = a;
a = t;
}
while (b !== 0) {
t = b;
b = a % b;
a = t;
}
// Only need to calculate GCD
once, so "redefine" this method.
// (Actually not redefinition
it's defined on the instance itself,
// so that this.gcd refers to
this "redefinition" instead of
LCMCalculator.prototype.gcd.
// Note that this leads to a
wrong result if the LCMCalculator
object members "a" and/or "b" are
altered afterwards.)
// Also, 'gcd' === "gcd",
this['gcd'] === this.gcd
this['gcd'] = function () {
return a;
};
return a;
},
Example script[edit]
Below is a minimal example of a standardsconforming Web page containing JavaScript
(using HTML 5 syntax) and the DOM:
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<title>Minimal Example</title>
<body>
<h1 id="header">This is JavaScript</h1>
<script>
document.body.appendChild(document.crea
teTextNode('Hello World!'));
var h1 =
document.getElementById('header'); //
holds a reference to the <h1> tag
h1 =
document.getElementsByTagName('h1')[0];
// accessing the same <h1> element
</script>
<noscript>Your browser either does not
support JavaScript, or has it turned
off.</noscript>
</body>
</html>
Compatibility considerations[edit]
Main article: Web interoperability
Security[edit]
See also: Browser security
Cross-site vulnerabilities[edit]
Main articles: Cross-site scripting and Cross-site
request forgery
A common JavaScript-related security problem
is cross-site scripting, or XSS, a violation of
the same-origin policy. XSS vulnerabilities occur
when an attacker is able to cause a target Web
site, such as an online banking website, to include
a malicious script in the webpage presented to a
victim. The script in this example can then access
the banking application with the privileges of the
victim, potentially disclosing secret information or
transferring money without the victim's
authorization. A solution to XSS vulnerabilities is to
useHTML escaping whenever displaying untrusted
data.
Some browsers include partial protection
against reflected XSS attacks, in which the
attacker provides a URL including malicious script.
However, even users of those browsers are
vulnerable to other XSS attacks, such as those
where the malicious code is stored in a database.
Only correct design of Web applications on the
server side can fully prevent XSS.
XSS vulnerabilities can also occur because of
implementation mistakes by browser authors.[67]
Scripting engine[edit]
Application platform[edit]
Development tools[edit]
Within JavaScript, access to a debugger becomes
invaluable when developing large, non-trivial
programs. Because there can be implementation
differences between the various browsers
(particularly within the Document Object Model), it
is useful to have access to a debugger for each of
the browsers that a Web application targets.[94]
Script debuggers are integrated within Internet
Explorer, Firefox, Safari, Google
Chrome, Opera and Node.js[95][96][97]
In addition to the native Internet Explorer
Developer Tools, three debuggers are available for
Version history[edit]
See also: ECMAScript Versions,
and ECMAScript Version correspondence
JavaScript was initially developed in 1996 for use
in the Netscape Navigator browser. In the same
year Microsoft released an implementation for
Internet Explorer. This implementation was
called JScript due to trademark issues. In 1997 the
Rel
Ve eas
rsi e
on dat
e
Equival
ent to
Net
sca
pe
Na
vig
ato
r
1.
0
Ma
rch
199
6
2.0
1.
1
Au
gus
t
199
6
3.0
1.
2
Jun
e
199
7
4.0
4.0
5
1.
3
Oct
obe
r
199
8
1.
4
ECMA262 1st
+ 2nd
edition
4.0
64.7
x
Net
sca
pe
Ser
ver
M
oz
ill
a
Fi
re
fo
x
Int
er O S Goo
net p af gle
Ex er ar Chr
plo a i ome
rer
3.0
3[1
05]
4.0
5[1
06]
No
ve
mb
er
200
0
ECMA262 3rd
edition
1.
6
No
ve
mb
er
200
5
1.5 +
array
extras +
array
and
string
generics
+ E4X
1.
5
1.
7
Oct
obe
r
200
6
1.6
+ Pytho
nic
generato
rs +
iterators
+ let
2.
0
1.
8
Jun
e
200
8
1.
5
1.7
+ genera
tor
expressi
ons + ex
6.0
1.
0
3.
0
5.5
(JS
cri
pt
5.5
),
6
(JS
cri
pt
5.6
),
7
(JS
cri
pt
5.7
),
8
(JS
cri
pt
5.8
)
7.
0
3.
05
1.010.0
.666
28.0
.150
0.95
1
1.
5
0
pression
closures
1.
8.
1
1.
8.
2
Jun
e
22,
200
9
1.8
+ native
JSON su
pport +
minor
updates
3.
5
1.8.1 +
minor
updates
3.
6
readable source code. Java's objects are classbased, while JavaScript's are prototype-based.
Finally, Java did not support functional
programming until Java 8, while JavaScript has
done so from the beginning, being influenced
by Scheme.