函数声明

1
2
3
4
5
6
7
8
// 函数声明方式
function name() {
// code
}
// 函数表达方式
var name = function () {
// code
};

函数与变量同名时的问题

  1. 使用函数声明方式时

    变量会覆盖函数,与顺序无关

    1
    2
    3
    4
    5
    6
    7
    8
    var fn = "message";

    function fn() {
    return 100;
    }

    console.log(fn); //输出message
    fn();//报错 TypeError: fn is not a function
  2. 使用函数表达式方式时

    函数会覆盖变量(变量先声明,函数后声明),与顺序有关。

    简单来说就是变量的重复声明

    1
    2
    3
    4
    5
    6
    7
    var fn = "message";

    var fn = function () {
    return 100;
    };

    console.log(fn); //输出 [Function: fn]

所以我们的得出结论:

  • 函数的声明方式和函数的表达式方式,在内存的结构上应该是不同的
  • 当使用函数声明方式时,变量名与函数名同名时,变量会覆盖函数

函数参数

传入参数数量的情况

  • 函数形参与实参个数相同

    正常运行

  • 传入实参少于形参个数

    不报错,但少传入的参数会变成undefined

  • 传入实参多余形参个数

    不报错,多余的参数会舍弃

1
2
3
4
5
6
function test1(a, b) {
console.log(a, b);
}
test1(1);

test1(1, 2, 3);
情况参数a参数b参数c结果
正常传入传入传入不涉及正常运行
少传入一个参数传入不传入不涉及正常运行,但b参数会称为undefined
多传入一个参数传入传入传入正常运行,但b参数会被舍弃掉。

利用JavaScript第二个特性(少传入不报错),我们可以在一个函数中实现多个不同的功能。

1
2
3
4
5
6
function test1(a, b) {
console.log(a, b);
if (b === undefined) {
console.log("undefind");
}
}

解决第三个问题:

因为不定义参数并不会导致函数报错,因此函数定义时可以不必声明形参,利用JavaScript提供的一个属性可以获得传入参数。

1
2
3
4
5
6
function test() {
console.log(arguments.length); //输出 4
console.log(arguments); // 输出 [Arguments] { '0': 1, '1': 2, '2': 3, '3': 4 }
console.log(arguments[0]); //可以以数组方式进行取值 输出1
}
test(1, 2, 3, 4);

函数返回值的作用

  1. 函数返回值

    也就是一个函数返回的东西

  2. 阻止代码执行

    页面开发时,当return false时,阻止DOM事件的冒泡

    return语句后所有的语句都不执行。