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>