### 命令式思想
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,可使用下劃線區分