0. 函数式编程

函数(的声明)是一个固定的功能或者程序段被封装的过程

为了实现一个固定的功能或程序,这个封装体需要提供一个入口和一个出口,入口就是函数的参数,出口就是函数的返回值

1. 函数的声明

1.1 方式一 function 声明

  • function 功能相当于 var
  • 命名规范:同变量命名规则,小驼峰命名法
    1. function test(参数) {
    2. 函数的执行语句
    3. }

    1.2 方式二 表达式/字面量声明

  1. 匿名函数表达式、函数字面量 var test = function() { };
  2. 具名函数表达式:var test = function test1() {};
    • 使用test();调用函数
    • test1 在外部是不可见的,test1(); -> test1 is not defined
    • test.name -> "test1"
    • 在函数内部可以调用test1(),即递归调用

      2. 函数的参数

      ```javascript function test(a, b) { console.log(a, b) }

var aa = 2, bb = 3;

test(aa, bb)

  1. <a name="mieCe"></a>
  2. ## 2.1 形参与实参的概念
  3. - a, b 为形参,用于形式上的占位。
  4. - aa, bb 为实参,实际调用时分别赋值给a, b
  5. - 形参可以看作定义在函数中的变量,在函数调用时再将传入的实参赋值给对应的形参
  6. <a name="V6L56"></a>
  7. ## 2.2 形参与实参的个数问题
  8. - 形参和实参数量可不等
  9. - 实参可在函数运行时通过`函数名.arguments`变量获取
  10. - arguments 为数组类型,可使用`arguments[index]`获取每个位置上的形参
  11. - arguments.length即为实参的个数
  12. - 形参个数可以通过`函数名.length`获取
  13. <a name="O0Pi7"></a>
  14. ## 2.3 形参与实参的映射
  15. - 形参变量与实参arguments数组中对应位置的值并不是同一个变量(形参储存在栈内存,而实参数组储存在堆内存中)
  16. - 若函数调用时,第i个位置的参数传入了值,则`arguments[i]`有值。此时`arguments[i]`与第i个形参具有映射关系,第i个形参值改变时,`arguments[i]`的值也会发生相应的变化。
  17. - 若函数调用时,第i个位置的参数未传入值,则`arguments[i]`不存在或为undefined。此时i,`arguments[i]`与第i个形参无映射关系,不会随着形参值的变化而变化
  18. <a name="nPCPl"></a>
  19. ## 2.4 函数的return
  20. <a name="RanGl"></a>
  21. ### 2.4.1 作用一:终止函数的执行
  22. - 函数执行到return语句时,结束执行
  23. - return语句后面的语句都不执行
  24. - 函数体中不存在return语句时,JS引擎会在函数体末尾自动添加return语句
  25. <a name="xaJCg"></a>
  26. ### 2.4.2 作用二:返回函数执行的结果
  27. <a name="zEOLL"></a>
  28. ## 2.5 函数作为局部作用域(作用域初识
  29. - 函数(局部作用域)内部可读取 外部 / 全局作用域 内的变量
  30. - 局部作用域中定义的变量在外部作用域中 是不可见的
  31. ```javascript
  32. a = 1; // 全局变量
  33. function test1() {
  34. var b = 2; // 函数test1作用域内的局部变量
  35. console.log(a, b); // -> 1, 2
  36. function test2() {
  37. var c = 3; // 函数test2作用域内的局部变量
  38. console.log(a, b, c); // -> 1, 2, 3
  39. }
  40. test2();
  41. console.log(c); // 报错,c未定义
  42. }
  43. test1();
  44. console.log(b, c); // 报错,b,c未定义

案例:

1. 累加函数(实参个数不确定)

  1. function sum() {
  2. var s = 0;
  3. for (var i = 0; i < sum.arguments.length; i++) {
  4. s += sum.arguments[i];
  5. }
  6. return s
  7. }
  8. sum(1, 2, 3, 4, 5);

2. 编写函数求n的阶乘(不能用for循环)

  1. // 1. 规律
  2. // 2. 出口
  3. function factorial(n, f) {
  4. if(n === 1) return 1;
  5. return n * factorial(n - 1);
  6. }

3. 编写函数求第n位斐波那契数列的值(不能用for循环)

  1. function fibonacci(n) {
  2. if(n === 0) return 0;
  3. if(n === 1) return 1;
  4. return fibonacci(n - 1) + fibonacci(n - 2);
  5. }