什么是高階函數(shù):就是一個函數(shù)的參數(shù)是函數(shù),或者返回值是函數(shù),滿足其中一個就是高階函數(shù)
開閉原則:對擴(kuò)展是開發(fā)的,對修改是封閉的
1.定義計算器方法
functioncalc(num1,num2,callback){
callback(num1,num2)
}
2.回調(diào)函數(shù)
輸出數(shù)組中所有的數(shù)
輸出數(shù)組中所有的奇數(shù)
輸出數(shù)組中所能被3整除的數(shù)
分析問題:都用到了for循環(huán)
定義一個通用的for方法:
functionbingFor(arr,callback){
for(leti=0;i<arr.length;i++){
if(callback(arr[i])){
console.log(arr[i]);
? ? ? ? ? ? ? ?}
? ? ? ? }
}
3.數(shù)組的高階方法
1.forEach()方法,用于循環(huán)遍歷整個數(shù)組
該方法的參數(shù)是一個回調(diào)函數(shù),回調(diào)函數(shù)可以傳兩個參數(shù),第一個參數(shù)是數(shù)組中的每一項(xiàng)元素,
第二個參數(shù)是每一項(xiàng)元素對應(yīng)的下標(biāo)。
注意:第二個參數(shù)可以省略。
案例:
?let arr = [11,22,33,44,55,66,77,88,99,111,222,333,444]
? ? ? ? arr.forEach((val,index)=>console.log(index+'-'+val))
2.filter()方法,用于過濾數(shù)組中的元素,返回過濾結(jié)果
?let arr1 = arr.filter(val => val % 2===0)
? ? ? ? console.log(arr1);
? ? ? ? let arr2 = arr.filter(val => val % 3===0)
? ? ? ? console.log(arr2);
3.find()方法,用于獲取數(shù)組中滿足規(guī)則的第一個元素
let num1 = arr.find(val=> val % 3===0)
? ? ? ? console.log(num1);
4.findIndex()方法,用于獲取數(shù)組中滿足規(guī)則的第一個元素下標(biāo)
let index1 = arr.findIndex(val => val % 3===0)
? ? ? ? console.log(index1);
5.some()方法,用于表示數(shù)組中是否有滿足指定規(guī)則的元素,有返回true,一個都沒有返回false
let isHave1 = arr.some(val => val>1000)
? ? ? ? console.log(isHave1);
? ? ? ? let isHave2 =arr.some(val => val===222)
? ? ? ? console.log(isHave2);
6.every()方法,用于表示數(shù)組中是否所有元素都滿足指定的規(guī)則
?let isHave3 = arr.every(val => val > 10)
? ? ? ? console.log(isHave3);
? ? ? ? let isHave4 = arr.every(val => val % 2 ===0)
? ? ? ? console.log(isHave4);
7.map()方法,用于將原始數(shù)組里面的數(shù)據(jù)根據(jù)指定的規(guī)則返回新的數(shù)組
let arr3 = arr.map(r=>r%7)
? ? ? ? console.log(arr3);
8.sort()方法,對數(shù)組的元素進(jìn)行排序
?let arr4 = [33,22,55,7,46]
?console.log(arr4);
? ? ? ? arr4.sort((a,b)=>a-b)
? ? ? ? console.log(arr4);
? ? ? ? arr4.sort((a,b)=>b-a)
? ? ? ? console.log(arr4);
9.回調(diào)函數(shù)需要傳兩個參數(shù),返回參數(shù)1-參數(shù)2是升序,返回參數(shù)2-參數(shù)1是降序
? let sum1 = arr4.reduce((a,b)=>{
? ? ? ? ? ? return a+b
? ? ? ? })
? ? ? ? console.log(sum1);
10.reduce()方法,統(tǒng)計數(shù)組中元素的值(從左到右)
?let sum2 = arr4.reduce((a,b)=>{
? ? ? ? ? ? return a+b
? ? ? ? },0)
? ? ? ? console.log(sum2);
11.reduceRight()方法,統(tǒng)計數(shù)組中元素的值(從右到左)
? let sum3 = arr4.reduceRight((a,b)=>{
? ? ? ? ? ? return a+b
? ? ? ? })
? ? ? ? console.log(sum3);
4.閉包函數(shù)
定義一個a方法,在a方法中定義一個b方法,并且b方法里面用到了a方法里面定義的變量,
那么此時就形成了閉包函數(shù)
由于內(nèi)部方法里面,用到外部方法里面的變量,外部方法里面的那個變量會一直在內(nèi)存中存保存著
總結(jié):兩個方法嵌套定義,里面的方法,用到了外面方法里面定義的變量,此時這兩個方法就形成了閉包。
閉包案例:計算機(jī):
functioncalc(n1,n2,type){
// 數(shù)據(jù)定義在函數(shù)里面,用參數(shù)傳值,保證了數(shù)據(jù)的安全性
letnum1=n1letnum2=n2
switch(type){
case'+':
return function(){
console.log(`${num1}+${num2}=${num1+num2}`);
}
case'-':
return function(){
console.log(`${num1}-${num2}=${num1-num2}`);
? ? ? ? ? ? ? ? }
? ? ? ?}
}