# 函数
我们知道圆的面积计算公式为:
```[math]
S=\pi r^2
```
当我们知道半径`r`的值时,就可以根据公式计算出面积。假设我们需要计算3个不同大小的圆的面积:
~~~
var r1 = 12.34;
var r2 = 9.08;
var r3 = 73.1;
var s1 = 3.14 * r1 * r1;
var s2 = 3.14 * r2 * r2;
var s3 = 3.14 * r3 * r3;
~~~
当代码出现有规律的重复的时候,你就需要当心了,每次写`3.14 * x * x`不仅很麻烦,而且,如果要把`3.14`改成`3.14159265359`的时候,得全部替换。
有了函数,我们就不再每次写`s = 3.14 * x * x`,而是写成更有意义的函数调用`s = area_of_circle(x)`,而函数`area_of_circle`本身只需要写一次,就可以多次调用。
```js
//定义计算圆的面积的函数
function area_of_circle(r) {
//实用内置Math库的函数实现
s = Math.PI * Math.pow(r, 2)
// s = Math.PI * r * r
return s;
}
```
## 抽象
抽象是数学中非常常见的概念。举个例子:
计算数列的和,比如:`1 + 2 + 3 + ... + 100`,写起来十分不方便,于是数学家发明了求和符号∑,可以把`1 + 2 + 3 + ... + 100`记作:
```[math]
\sum_{n=1}^{100} {n}
```
这种抽象记法非常强大,因为我们看到 ∑ 就可以理解成求和,而不是还原成低级的加法运算。
而且,这种抽象记法是可扩展的,比如:
```[math]
\sum_{n=1}^{100} {(n^2+1)}
```
还原成加法运算就变成了:
```
(1 x 1 + 1) + (2 x 2 + 1) + (3 x 3 + 1) + ... + (100 x 100 + 1)
```
可见,借助抽象,我们才能不关心底层的具体计算过程,而直接在更高的层次上思考问题。
## 作业
编写计算斐波拉切数列的函数。
```[math]
f_0=0,f_1=1
f_n=f_{n-1}+f_{n-2}
```
- 内容介绍
- EcmaScript基础
- 快速入门
- 常量与变量
- 字符串
- 函数的基本概念
- 条件判断
- 数组
- 循环
- while循环
- for循环
- 函数基础
- 对象
- 对象的方法
- 函数
- 变量作用域
- 箭头函数
- 闭包
- 高阶函数
- map/reduce
- filter
- sort
- Promise
- 基本对象
- Arguments 对象
- 剩余参数
- Map和Set
- Json基础
- RegExp
- Date
- async
- callback
- promise基础
- promise-api
- promise链
- async-await
- 项目实践
- 标签系统
- 远程API请求
- 面向对象编程
- 创建对象
- 原型继承
- 项目实践
- Classes
- 构造函数
- extends
- static
- 项目实践
- 模块
- import
- export
- 项目实践
- 第三方扩展库
- immutable
- Vue快速入门
- 理解MVVM
- Vue中的MVVM模型
- Webpack+Vue快速入门
- 模板语法
- 计算属性和侦听器
- Class 与 Style 绑定
- 条件渲染
- 列表渲染
- 事件处理
- 表单输入绑定
- 组件基础
- 组件注册
- Prop
- 自定义事件
- 插槽
- 混入
- 过滤器
- 项目实践
- 标签编辑
- iView
- iView快速入门
- 课程讲座
- 环境配置
- 第3周 Javascript快速入门