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

Custom theming
author Radomir Dopieralski <radomir.dopieralski@allegro.pl>
date Wed, 27 Jun 2012 16:35:54 +0200
parents f9f6684f9b32
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
112
df92f9f165c7 Add closures.rst and it JavaScript test.
jf3243
parents:
diff changeset
1 Closures
df92f9f165c7 Add closures.rst and it JavaScript test.
jf3243
parents:
diff changeset
2 ========
df92f9f165c7 Add closures.rst and it JavaScript test.
jf3243
parents:
diff changeset
3
113
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
4 You'll see closures a lot in JavaScript. The reasons for this are:
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
5
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
6 #. In JavaScript, :doc:`bind-is-transient`.
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
7
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
8 #. It is callback functions attached to DOM elements that respond to
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
9 events.
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
10
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
11 #. Most code attaches callbacks to individual DOM elements (rather
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
12 than delegating to a parent element).
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
13
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
14
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
15 Test code
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
16 ---------
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
17
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
18 Here's the test code for closures.
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
19
135
f9f6684f9b32 $ hg mv tutorial.js core-javascript-work/ # and amend the rst files also
jf3243
parents: 133
diff changeset
20 .. literalinclude:: /core-javascript-work/tutorial.js
112
df92f9f165c7 Add closures.rst and it JavaScript test.
jf3243
parents:
diff changeset
21 :language: javascript
df92f9f165c7 Add closures.rst and it JavaScript test.
jf3243
parents:
diff changeset
22 :start-after: start closures
df92f9f165c7 Add closures.rst and it JavaScript test.
jf3243
parents:
diff changeset
23 :end-before: end closures
113
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
24
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
25
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
26 Discussion
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
27 ----------
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
28
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
29 The factory function creates two functions, *get* and *set*, which
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
30 refer to the variable *value* of the factory function. The *get*
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
31 function returns the value of this variable, while the *set* function
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
32 changes it.
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
33
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
34 To test the factory function we create two get-set pairs. We then
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
35 test that each *set* operation changes the value return by its partner
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
36 *get* operation.
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
37
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
38 Finally, we test that the two pairs don't interfere with each other.
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
39
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
40
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
41 Explanation
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
42 -----------
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
43
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
44 Objects continue to exist so long as a reference remains to them.
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
45 When the last reference to an object is removed (or when the object is
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
46 part of *cyclic garbage*) the object can be destroyed. When the
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
47 return value of a function is stored (say as the value of a variable)
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
48 then this return value continues to exist. Similarly, anything
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
49 referred to by the return value continues to exist.
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
50
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
51 Closures come about when the return value of a function is itself a
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
52 function defined within the outer function (or contains references to
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
53 such functions).
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
54
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
55 Suppose the outer function returns an *inner function* (or in other
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
56 words a function that is defined within the outer function). Suppose
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
57 also that the inner function uses a variable (or parameter) of the
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
58 outer function. In this situation the inner function holds a
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
59 reference to the value of this variable. The code in the inner
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
60 function can read (or get) this value. It can also write to this
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
61 variable.
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
62
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
63 One final point. Each call of the outer function creates a new
e73b36990587 Add Discussion and Explanation for closures.
jf3243
parents: 112
diff changeset
64 instantiation of the function variable.
131
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
65
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
66
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
67 Exercises
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
68 ---------
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
69
133
0fed95c1f449 Minor change to closures.rst.
jf3243
parents: 131
diff changeset
70 A programmer, perhaps in a hurry, misses out a *var* in the example
0fed95c1f449 Minor change to closures.rst.
jf3243
parents: 131
diff changeset
71 above. So now it reads:
0fed95c1f449 Minor change to closures.rst.
jf3243
parents: 131
diff changeset
72
131
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
73 .. code-block:: javascript
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
74
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
75 var get_set_factory = function(){
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
76
133
0fed95c1f449 Minor change to closures.rst.
jf3243
parents: 131
diff changeset
77 value; // Here's the missing *var*.
131
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
78
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
79
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
80 #. Which tests to you expect to pass, and which to fail?
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
81
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
82 #. Make this change and run the tests. Which actually fail?
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
83
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
84 #. Explain what is happening.
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
85
90760bc0bf9a Add Exercises to closures.rst.
jf3243
parents: 113
diff changeset
86 #. What does this tell us about coding and testing?