annotate core-javascript/global.rst @ 213:0ea90a1819c2 default tip

Custom theming
author Radomir Dopieralski <radomir.dopieralski@allegro.pl>
date Wed, 27 Jun 2012 16:35:54 +0200
parents 29c7fe19aeb5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
104
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
1 The global object
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
2 =================
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
3
127
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
4 JavaScript has a global object. It is, so to speak, the object of
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
5 last resort. If there's no other suitable object then JavaScript will
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
6 use the global object (rather than reporting an error).
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
7
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
8 .. note::
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
9
207
29c7fe19aeb5 Mark inline code using duble backticks
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents: 127
diff changeset
10 Douglas Crockford writes **JavaScript's global object [...] is far and
127
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
11 away the worst part of JavaScript's many bad parts.**
104
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
12
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
13
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
14 Getting global
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
15 ---------------
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
16
127
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
17 Here's how to get the global object.
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
18
104
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
19 .. code-block:: javascript
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
20
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
21 js> return_this = function(){return this;}
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
22
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
23 function () {
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
24 return this;
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
25 }
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
26
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
27 js> global = return_this()
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
28 [object global]
127
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
29
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
30 The programmer who wants to can always obtain access to the global
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
31 object.
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
32
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
33
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
34 Global variables
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
35 ----------------
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
36
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
37 Global variables are nothing more than attributes of the global
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
38 object.
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
39
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
40 .. code-block:: javascript
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
41
104
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
42 js> s = 'Hello world.'
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
43 Hello world.
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
44 js> global.s
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
45 Hello world.
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
46 js> global.i = 42
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
47 42
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
48 js> i
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
49 42
127
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
50
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
51
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
52 Global pollution
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
53 ----------------
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
54
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
55 It's very easy to inadvertently pollute (change) the global object.
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
56 All it takes is an assignment to an undeclared variable in a function.
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
57
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
58 .. code-block:: javascript
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
59
104
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
60 js> pollute = function(n){ i = n; };
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
61 function (n) {
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
62 i = n;
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
63 }
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
64 js> i
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
65 42
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
66 js> pollute(13)
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
67 js> i
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
68 13
127
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
69
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
70 More global pollution
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
71 ---------------------
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
72
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
73 There's a more subtle way to pollute the global object, which involves :doc:`JavaScript's this object <what-is-this>`.
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
74
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
75 To begin with, note that we can push values onto an array.
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
76
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
77 .. code-block:: javascript
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
78
104
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
79 js> array = []
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
80
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
81 js> array.push(1, 2, 3)
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
82 3
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
83 js> array
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
84 1,2,3
127
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
85
207
29c7fe19aeb5 Mark inline code using duble backticks
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents: 127
diff changeset
86 Let's try using ``array.push`` as a stand-alone function.
127
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
87
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
88 .. code-block:: javascript
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
89
104
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
90 js> p = array.push
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
91 function push() { [native code for Array.push, arity=1] }
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
92
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
93 js> p(4, 5, 6)
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
94 3
127
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
95
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
96 The push function returns the length of the object it has just pushed
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
97 to. So the value *3* above is a signal that all is not well. And
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
98 indeed it is not. The original array is unchanged, and the global
207
29c7fe19aeb5 Mark inline code using duble backticks
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents: 127
diff changeset
99 object has an entry at *0*.
127
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
100
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
101 .. code-block:: javascript
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
102
104
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
103 js> array
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
104 1,2,3
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
105 js>
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
106 js> global[0]
7b81c64941f9 Make a start on global.rst (more work required).
jf3243
parents:
diff changeset
107 4
127
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
108
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
109 It's also got a length!
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
110
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
111 .. code-block:: javascript
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
112
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
113 js> global.length
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
114 3
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
115
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
116
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
117 Explanation
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
118 -----------
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
119
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
120 This behaviour is a consequence of :doc:`what-is-this` and
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
121 :doc:`bind-is-transient`, together with JavaScript's no-exceptions
51968c560233 Finish off global.rst.
Jonathan Fine <jfine@pytex.org>
parents: 104
diff changeset
122 design.