编程原则:高内聚,低耦合 => 单一责任制
    作用:解耦合,把重复代码提取出来
    命名函数 :
    1、函数申明

    1. function fn() {
    2. //不要var a = b = 1;
    3. //这样申明,b是挂载window上的。
    4. }
    5. console.log(b) => 1

    2、字面量

    1. var fn = function test(a,b){
    2. console.log(test.length) => 打印形参个数
    3. console.log(arguments.length) => 打印出实参个数
    4. //arguments为类数组,有length,可以循环、但是没有数组相关方法。
    5. //arguments[1] => 通过arguments获取相关实参
    6. //函数内部可以调用test进行递归操作
    7. }
    8. test() //=> 报错 ,这种赋值方法,系统把右边看做了一种表达式,并没有申明函数,所以调用会报错。
    9. console.log(fn.name => test)
    10. fn(1,2,3) //=> 正常执行

    statement : a kinda action. suce as loops and if statements.
    expression : produces a value.
    关于表达式和语句的文章 : https://2ality.com/2012/09/expressions-vs-statements.html
    3、arguments
    不知道实参个数,可以通过arguments实现参数累加等计算

    1. function fn(){
    2. var sum = 0;
    3. for (var i = 0; i < arguments.length;i++){
    4. sum += arguments[i]
    5. }
    6. console.log(sum)
    7. }

    4、形参和实参的映射

    1. function fn(a,b){
    2. a = 3
    3. b = 6
    4. console.log(arguments[0], arguments[1]) //=> 3,undefined
    5. }
    6. fn(1)

    js中函数不在乎参数有无以及数据类型。
    arguments对象的值会自动同步到形参,但不与形参存在同一内存地址。有映射关系的形参和实参保持同步。传了值的形参可以通过arguments来改变,但是没有接受到参数的形参则不会(始终都是undefined)因为没有映射关系,这是因为arguments的长度只由实际实参个数决定。
    参数默认值
    function(a, b=1){}
    js中参数默认值默认为undefined,但可以在形参后面加上=,设置默认值
    如果实参为undefined,而形参有默认值,则形参取默认值,传其他falsy则直接取实参值