1 <!DOCTYPE html>
2 <html>
3 <head lang="en">
4 <meta charset="UTF-8">
5 <title></title>
6
7 <script type="text/javascript">
8 //第一种定义方式
9 function fn1(){
10 alert("fn1"); //fn1
11 }
12 //函数就是一个非常特殊的对象,是一个Function类的实例,其实在内存中存储的操作是通过一个键值对来存储的
13 alert(typeof fn1()); //function
14
15 //由于函数是一个对象,所有可以通过如下方式定义
16 //此时 fn2指向与fn1一样的函数,但是js与java不同点:
17 // 1、java中key放置到堆栈中,函数放置到内存中,即此时fn1放置到堆栈中,函数value放置到内存中
18 // 此时fn2 = fn1 ,堆栈中重新创建一个对象fn2,虽然此时fn2指向的函数仍然与fn1指向的函数相同,
19 // 但是fn2 的函数已经与fn1 的函数已经不属于一块内存了,不像java指向的仍然还是一块内存区域
20 var fn2 = fn1;
21 fn2(); //fn1
22 fn1 = function(){
23 alert("fnn1");
24 }
25 //函数虽然是一个对象,但是却和对象有区别,对象是通过引用的的指向完成对象的赋值操作,
26 //而函数确实通过对象的拷贝来完成的
27 //所以fn1虽然改变了,但是不会影响fn2
28 fn2(); //fn1
29 fn1(); //fnn1
30
31 /**
32 * 对于对象而言,是通过引用的指向来完成赋值的,此时修改o1或者o2会将两个只完成修改,与java中的方式相同
33 * @type {Object}
34 */
35 var o1 = new Object();
36 var o2 = o1;
37 o2.name = "LEON";
38 alert(o1.name); //LEON
39
40
41 </script>
42
43 </head>
44 <body>
45
46 </body>
47 </html>
![](https://images2015.cnblogs.com/blog/657735/201603/657735-20160305115601737-339262041.png)