1.在JavaScript中,函数分为两种:一种为关键字形式函数,通过function进行声明定义;另一种为表达式形式的函数。
函数如果只声明未调用,则声明语句不会执行。
2.形式参数:在函数声明时,声明部分的小括号里可以书写形参。
实际参数:在函数调用时,传递数据的参数为实参。
3.变量作用域
<script type="text/javascript"> var num = 66; function fun(){ console.log(num); var num = 99; } fun() </script>
以上程序输出结果为undefined,这是因为JavaScript中会将变量声明部分会提升,但不会将赋值部分提升。即var num;语句会提升到console.log(num);语句之前。
任何语句都无法阻止变量声明部分的提升
4.关键字return
关键字return一般只能在函数体中使用。其作用为:
①在函数体中如果遇见关键字return,函数体中后面的语句不再执行;
②函数体中关键字可以将计算完的结果返回。
<script type="text/javascript"> function add(num1,num2){ return num1+num2; } var result = add(2,3) console.log(result) </script>
上例输出结果为5。
5.表达式形式函数
将关键字function定义的函数赋值给变量,这种形式的函数就称为表达式形式函数。
var abc=function fun1(){ console.log("啦啦啦"); } abc();
上例中函数名fun1可以省略,省略后称为匿名函数。
6.两种形式函数的比较
①关键字形式函数的声明会被提升到作用域的最上方,因此可以在声明之前调用函数。
<script type="text/javascript"> fun1() function fun1(){ console.log(666); } </script>
②在表达式形式函数中,变量的声明部分会被提升,但变量的赋值部分即函数的声明部分不会提升,因此不能在声明之前使用。
<script type="text/javascript"> console.log(abc) var abc = function fun1(){ console.log(666); } </script>
7.回调函数:当一个函数执行时,传递的实参是另一个函数的声明部分。
<script type="text/javascript"> function promise(callback){ callback(); } promise(function(){ console.log("我执行了!") }) </script>
8. 函数递归:函数直接或间接调用自身的现象。
<script type="text/javascript"> function fun1(){ console.log('我执行了!') fun1() } fun1() </script>
注意:使用这种方式时,要避免出现死循环。
9.IIFE(immediately invoking function express):在声明表达式形式函数的同时立刻马上执行一次。
①
<script type="text/javascript"> var fun = function(){ console.log('我执行了!') }(); </script>
在表达式形式函数声明后加上小扩号即可构成IIFE。
②对于关键字形式的函数,可使用+、-、!、()变成表达式形式的函数,再通过()构成IIFE。
<script type="text/javascript"> +function(){ console.log('+ - ! ()可以使关键字函数变为表达式形式函数') }(); </script>
<script type="text/javascript"> (function(){ console.log('+ - ! ()可以使关键字函数变为表达式形式函数') })(); </script>
③每个IIFE都有属于自己独立的作用域,且相互不影响。
//第一个IIFE +function(a){ console.log(a); }(100); //第二个IIFE +function(a){ console.log(a); }(66);