函数全解

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.函数的组合

你可能感兴趣的:(函数全解)