函数细节2

 1  <script>
 2 
 3         //关于变量提升现象:
 4         console.log(a);     //undefined
 5         var a = "Hello";    
 6         console.log(a);     //Hello
 7 
 8         // 上面的表达式由于变量提升,变成下面的样子。这就是变量提升的现象
 9 
10         var a;
11         console.log(a);
12         a = "Hello";
13         console.log(a);
14 
15         //在函数里面同样的道理
16         var b = "Hello"
17         function fn(){
18             console.log(b);     //undefined
19             var b = "Hi";       //变量提升提升到了函数内部一开始处
20             console.log(b);     //Hi
21         }
22 
23         fn();
24         console.log(b);     //Hello
25 
26 
27         //另外一种函数的声明方式
28         /*
29         匿名函数:
30             像定义一个变量一样去声明,把整个函数看成一个变量,用函数表达式的方式声明:
31 
32         */
33         //函数声明。(通常写的一种方式)
34         fn1();
35         function fn1(){
36             console.log("fn1");
37         }
38         fn1();
39 
40         //匿名函数
41         // function (){         
42         //     console.log("这是一个函数表达式");
43         // }        //直接这样写它是一个函数表达式,不赋值给变量的话会报错,需要一个变量接收它。
44         // 如下:
45         //函数表达式(又叫:命名函数表达式)
46         var fn2 = function (){
47             console.log("这是一个匿名函数");
48         }
49         fn2();      //只能在声明后调用(因为有变量提升)
50 
51         var fn3 = fn2;      //既然是变量,它还可以被重复赋值。
52         fn3();    //现在这个函数相当于有两个名字:fn2,fn3。 这两个名字都可以调用它
53         //函数声明也可以起这样的别名,重复赋值就行。所以不是说一个函数命名之后就不可改变,
54 
55 
56         //立即执行函数:匿名函数不一定要赋给一个变量,有时候我们会见到如下几种函数,就叫立即执行函数
57         //立即执行函数是一次性的,只能被执行一次。
58         (function (){
59             console.log("这是一个立即执行函数");
60         })();
61 
62         /*立即执行函数也可以接收参数*/
63         (function (name){
64             console.log("Hello,",name);
65         })("小明");
66 
67         /*立即执行函数也可以有返回值*/
68         var r = (function (a,b){        //这里的 r 接收的是返回值,而不是这个函数。
69             return a + b;
70         })(5,7);
71         console.log(r);
72 
73         console.log(typeof fn2);        //检测变量类型,在这里检测的结果是:function
74         console.log(typeof fn3);
75 
76 
77 
78         /*
79         js当中数据类型分为两大类
80             1:基本数据类型:重复赋值时赋的是数据本身,所以一个修改不会改变另一个的结果;
81                 number,string,boolean,undefined,null
82             2:引用数据类型:赋值时赋的是地址本身,操作了地址,一个修改就会影响所有的结果;
83                 array,object,function,Math,Date
84         */
85     </script>

 

posted @ 2020-07-22 09:19  军刀、  阅读(136)  评论(1编辑  收藏  举报