1.函数是什么?
子程序(routine):一个或多个语句组成,完成特定任务,相对独立。分为【函数】、【过程】、【方法】
1.1函数
Function,有返回值
1.2过程
Procedure,无返回值
1.3方法
Methods,类或对象中
2.函数的返回值由什么决定?
影响因素:
2.1调用时输入的参数params
2.2定义时的环境env
举例:
另一个例子:
这个例子说a是定义时的a,不是执行时的a
3.闭包
如果在函数里面可以访问外面的变量,那么:
【这个函数】+【这些变量】=【闭包】
闭包+时间 = 很容易令人困惑
一个常见的考题:
请问下面打印出什么
答案:6个6,因为六个函数公用一个i
改成符合预期的结果:
使用立即执行函数
或者用现代浏览器的简单方法
答案:0 1 2 3 4 5,每个函数配一个i即可
结论:
闭包的特点
1.能让一个函数维持住一个变量
2.但并不能维持这个变量的值
3.尤其是变量的值会变化的时候
对象是穷人的闭包
1.对象也可以来维持住一个变量
2.如果一门语言不支持闭包,你可以用对象代理
闭包是穷人的对象
如果一门语言不支持对象,你可以用闭包代理
4.this真变态
前置知识:
如何声明一个函数?
4.1箭头函数不支持this
箭头函数如何处理a,就如何处理this
即:
箭头函数把this当作外部的变量,仅此而已。但是非箭头函数的this有很多特殊处理
箭头函数不支持this指的就是:箭头函数对this与其他变量一视同仁,不会特殊对待
4.2非箭头函数的this
回顾上文函数的返回值影响因素有两个:1、调用时输入的参数;2、定义时的环境。
有人说this是上下文,其实this就是一个隐式参数而已,箭头函数把this当作环境,普通函数把this当作参数。
this的确定
5.递归
调用栈与弹栈
调用栈用来记忆【回到哪】。如果需要记忆的过多,就会爆栈!
6.柯里化
柯里化(Currying),让所有函数只接受一个参数。
6.1单参数函数接受两个参数
6.2 柯里化一个函数
把多参数函数,变成单参数函数
7.高阶函数
把函数作为参数或者返回值的函数
JS内置的高阶函数:
1.Function.prototype.bind
2.Function.prototype.apply
3.Function.prototype.call
4.Function.prototype.sort
5.Function.prototype.map
6.Function.prototype.filter
7.Function.prototype.reduce
7.1 Function.prototype.bind
7.2 Function.prototype.apply
7.3 Function.prototype.call
8.函数的组合