一、函数的概念

    函数对任何语言来说都是一个核心的概念。通过函数可以封装任意多条语句,而且可以反复调用执行。ECMAScript 中的函数使用 function 关键字来声明,后跟一组参数以及函数体,在JavaScript里,函数实际上是对象 , 同时也是对象的构造器。

    二、函数的声明和调用

    函数的声明

    普通函数:也叫声明式函数,有函数名称的函数。

    函数表达式:没有函数名称,也叫匿名函数。

    函数的调用

    这个函数可以通过其函数名来调用,后面还要加上一对圆括号和参数(圆括号中的参数如果有多个,可以用逗号隔开)

    对于普通函数,因为函数已经封装好了,而系统预检查会提前将封装好的普通函数提前预览并加载,所以调用函数在声明这个函数之前还是之后都是可以的,但是对于声明变量再给他赋值一个函数的情况,在这个变量初始化之前调用这个函数就是违规的,会报错;

    普通函数的组成

    函数的组成包括下面几部分

    function 函数名 参数 函数体(函数的返回值)

    1.function:声明函数,定义函数的关键字;

    2.函数名:自定义的标识符;

    3.参数:

    形参:出现在函数定义中,在整个函数体内都可以使用,多个形参用逗号分隔,形参用来接收真实的值;//例如: function fn(a , b){ console.log(a+b) } 其中a,b就是形参;

    实参:外部数据传入函数内部的值就是实参;//例如外部函数给上面的函数传入一个 fn(3,4),3,4就是实参,他们分别对应形参的a , b;

    4.函数体(函数的返回值)

    return 关键字完成函数的返回值;

    函数都有一条return语句,return语句会导致函数体停止执行,并返回他的表达式的值给调用者。如果 return 语句没有相关表达式(即函数体内 return 关键字和分号中间没有别的内容),则整个函数返回 undefined,如果没有函数体内 return 关键字不存在,也会给调用函数的表达式返回 undefined;

    return并不是必须要的,只有你需要函数给你返回一个值时,就需要加 return 来给调用函数的表达式返回参数;

    函数的名称就代表了整个函数,函数的名称在定义这个函数之后,相当于一个标识符、指针,在任何地方调用这个名称就相当于调用了整个函数,用 Typeof 输出这个名称类型时也显示的是函数;

    function ft() {函数体}

    在一段语句里单独调用函数名称不写括号 ft,会直接返回该函数内部的各种语句和操作(返回函数体),如果调用函数名称并加了括号 ft(),那么返回值是函数内部的 return 定义的返回值,而直接单独写下的一个函数名称得到的结果是函数本身;

    我们在设计一个函数时,也非常重要的就是,考虑一个变量的作用域;

    函数内定义的变量为局部变量,它的作用域是一个局部作用域,只能在声明该变量的函数内调用;

    在 script 标签主题中定义的变量是一个全局变量,对整个 script 的内容都能起作用,在我们的实际开发中应该尽可能少的使用全局变量;

    作用域链的概念:当函数执行时,总是先从函数内部寻找局部变量,如果找不到,则会向创建函数的作用域(声明函数的作用域)寻找,如果没有,则会逐级向上查询,局部变量的优先级是高于全局变量的;

    function a(){

    var num = 2

    function b(){

    var num = 3;

    function c(){

    var num = 4;

    function d(){

    var num = 5

    console.log(num);

    }

    d();

    }

    c();

    }

    b();

    }

    递归函数

    概念:递归函数是一个函数通过函数名字调用自身的情况下构成的,也就是说函数调用函数自己。

    递归的特点:递归和循环很相似,很多的递归可以直接使用循环实现,但是递归的代码(思路)更简洁。