Compare Revisions

Defining Functions

Revision 164582:

Revision 164582 by PauloAugusto on

Revision 164583:

Revision 164583 by Ncmathsadist on

Title:
Defining Functions
Defining Functions
Slug:
Talk:JavaScript/Guide/Obsolete_Pages/Defining_Functions
Talk:JavaScript/Guide/Obsolete_Pages/Defining_Functions
Content:

Revision 164582
Revision 164583
tt10    <p>
11      I teach programming and find this to be a most interesting 
 >discussion point. I will set the scene and explain the confusion.
12    </p>
13    <p>
14      Variable names, in JavaScript are just that, names. They po
 >int at objects that have type.
15    </p>
16    <p>
17      When the type is primitive, the name points directly at the
 > datum. When the type is non-primitive, the name points at a loca
 >tion in memory (a "locker number") where the actual object is sto
 >red.
18    </p>
19    <p>
20      The name of an object works like a telephone number. It is 
 >the handle by which you communicate with the object. When an obje
 >ct is primitive, you can only ask for its datum. When an object i
 >s not primitive, you can "send it a message" via its name. The na
 >me is not responsible for knowing what the message is to do: that
 > responsibility lies with the object.
21    </p>
22    <p>
23      All functions in Java and JavaScript are pass-by-value. The
 > important thing we ask is: <i>What do they pass?</i> A copy of t
 >he datum pointed at by the name is passed.
24    </p>
25    <p>
26      For a primitive type, that is the actual "thing" the name i
 >s referring to. For instance, if you have
27    </p>
28    <pre>
29var x = 5;
30.
31.
32..... f(x);
33</pre>
34    <p>
35      then a copy of the value 5 being pointed to by the variable
 > <tt>x</tt> is passed to <tt>f</tt>. No matter what <tt>f</tt> do
 >es, <tt>x</tt> will be unaffected back in the calling routine.
36    </p>
37    <p>
38      This situation tempts people to say that JavaScript is "pas
 >s by reference".
39    </p>
40    <pre>
41function switch(x){
42var tmp = x[0];
43x[0] = x[1];
44x[1] = tmp;
45}
46var arr = [1,2,3];
47//now arr points at [1,2,3]
48f(arr);
49//now array points at [2,1,3].
50</pre>
51    <p>
52      What is passed to <tt>switch</tt>? The "locker number" cont
 >aining the array! A copy of this is passed. The array changes. Su
 >re. It does so for the following reason. Imagine your house is wh
 >ite and you give someone a copy of your address and say, "paint t
 >he house at this address pink." You will come home to a pink hous
 >e. What we have just seen is the "pink house" effect.
53    </p>
54    <p>
55      Contrast that with this.
56    </p>
57    <pre>
58function trash(x)
59{
60x = [0];
61}
62var arr = [1,2,3]
63//arr points at [1,2,3]
64trash(arr)
65//whoa! arr still points at [1,2,3]
66</pre>
67    <p>
68      Imagine you give someone a copy of your address and you tel
 >l them, "Change this to 1400 Pennsylvania Ave, Washington, DC." W
 >ill you now reside in the White House? No. Changing a copy of you
 >r address in no way changes your residence.
69    </p>
70    <p>
71      Calling a mutator method on a passed object is essentially 
 >what happens in the pink house situation. In particular, this "pa
 >ss by reference" cannot occur on an immutable object.
72    </p>
73    <p>
74      <br>
75    </p>

Back to History