### 命令式思想
1. 相当于面向过程开发,一步一步自己实现
```
const arr = [1,2,3,4]
const newarr = []
for( let i = 0; i < arr.length; i++ ) {
newarr.push( arr[i] * 2 )
}
```
### 声明式思想
1. 只需要关注结果,不需要管过程是如何实现的
```
const arr = [1,2,3,4]
const newarr2 = arr.map(item => item * 2)
```
### 闭包
1. 闭包中两大重要概念:变量的作用域 && 变量的生命周期
2. 作用域:目前有三大作用域:全局作用域 && 函数作用域 && 块级作用域
3. 函数作用域中声明的变量:
1. 如果未用var声明,则会变成全局变量
2. 在函数内声明的变量只能在函数内部进行使用,外部无法访问到函数内部的变量
3. 函数内使用的变量可以向上查找,不会向下级的作用域查找,直到找到全局作用域,也就是顶层作用域,形成了所谓的作用域链
4. 变量的生命周期:
1. 声明在全局内的变量会一直存在,除非主动删除,否则都可以访问
2. 声明在函数内部的变量会随着函数的调用完成,进行销毁
```
function fn() {
var a = 10 //调用完后该变量生命周期终止,并销毁
}
fn()
```
5. 闭包的核心:函数调用完后,其上下文执行环境不会进行销毁
6. 闭包的两种应用场景:1. 函数做为返回值,2. 函数作为参数传递
7. 闭包的开发应用场景:
1. 延续局部变量的寿命,解决部分低版本浏览器在创建HTTP请求的时候变量已经被销毁的bug
2. 把一些不需要暴露在全局下的变量,封装成局部变量
```
var report = (function(){
var imgs = [];
return function( src ){
var img = new Image();
imgs.push( img );
img.src = src;
}
})();
```
### 函数节流
1. 当某些事件被频繁的触发,其事件回调也被频繁的触发,从而引发了性能上的问题
2. 常见的导致频繁触发的事件是:window.onresize onmousemove touchmove 触发频率过高的函数
3. 解决思路:setTimeout
### 函数分时加载
1. 假如页面中现在有1000条数据,需要创建1000个DOM元素,一次性渲染浏览器会很耗性能,可能使用分时加载函数
### 高阶函数
1. 满足两个条件之一都可以称为高阶函数:接收函数作为参数 || 函数作为返回值返回
### 函数柯里化:curring
1. 函数柯里化又称部分求值,首先会接收一些参数,接收这些参数之后不会立即进行求值,而是继续返回另一个函数,
之前传入的参数在函数形成的闭包中保存起来,待真正需要求值的时候一次求出来
### 命名空间
1. 命名空间可以减少全局变量的污染:声明为对象的属性,自执行函数,使用闭包包装私有变量,_init,可使用下划线区分