1.函数定义的两种方式:函数声明 和 函数表达式
![](https://img.haomeiwen.com/i16097926/34470d47b394a20e.png)
函数声明和函数表达式的区别:
函数声明的函数必须要有名字,函数表达式可以没有名字。
函数声明会有函数提升,声明前后调用都可以
函数表达式类似于变量赋值,函数表达式定义的函数必须要在表达式之后执行之后才能调用
2.函数的调用
普通函数调用 构造函数的调用 对象方法的调用
3.函数内部this的指向
关键点:有没有调用,有没有对象的参与
普通函数内部的this指向:window
构造函数内部的this:指向的实例对象
方法内部的this指向:绑定该方法的对象
定时器内部this指向:window
事件绑定函数中this指向:该事件绑定的对象
4.函数也是对象(因此也和对象一样具备一些方法)
call方法(会立即调用函数,第一个函数改变函数内部this的指向,如果第一个参数指定了 null 或者 undefined 则内部 this 指向 window)
apply方法(会立即调用函数,第一个参数改变函数内部this的指向,第二个参数是以数组的形式传入到函数内部,如果第一个参数指定了 null 或者 undefined 则内部 this 指向 window)
bind方法(不会立即调用函数,可以改变函数内部this的指向,第一个参数改变函数内部this的指向,对于匿名函数后面点bind直接使用,对于有名字的函数,需要参数函数名来调用,然后返回一个新函数)
通过bind方法可以改变事件处理函数中this的指向
![](https://img.haomeiwen.com/i16097926/02272b32a47b01a2.png)
bind方式传参比较特殊,一共有两次机会可以传递函数:1.bind的时候传入参数 2.调用函数的时候传递参数,这两次传递的参数会进行合并,然后传入到函数内部,
5.函数的其他成员
arguments 实参的集合 caller 函数调用者 name函数的名字 length 形参的个数.
6.高阶函数
函数作为参数:在定时器当中,函数也作为了参数
函数作为返回值
7.闭包
闭包发生在函数嵌套,当内层函数想要访问外部函数的变量,函数执行完毕本应该被销毁的变量,并没有被销毁,内部函数还是可以访问外部函数的变量。但是正因为本该在函数执行完毕要销毁的变量没有被销毁,从而把变量存储到了内存当中,耗费了内存资源。
8.递归
函数递归就是函数自己调用自己,
在递归的过程中会出现差错,内存溢出,通常情况下要给出一个递归结束条件
递归的应用场景,对象的深拷贝,遍历DOM树
网友评论