一、回调函数
1.回调函数(callback): 如果把函数当成实参传入到另一个函数里执行,那么这个函数就被称为回调函数。
function fn(cb){
cb(1,2,[1,2,3]); //在fn调用的时候,也可以执行cb回调函数
}
fn(function(item,key,arr){
console.log("新函数","传入的实参是",item,key,arr);
}); //新函数 传入的实参是 1 2 (2) [1, 2]
//这里的调用 ,把函数当成实参传入到上面的fn函数里
二、实现一个myForEach方法达到内置forEach效果
var arr = ["张三","李四","王五"];
function myforEach(arr,fn) {
// arr 是数组
// fn是 传入的函数 function (item,key,arr) {}
// 循环数组
for(var i=0;i<arr.length;i++){
fn(arr[i],i,arr); //会被调用三次 ,回调函数调用传入的实参
}
}
// 自己的forEach
myforEach(arr,function (item,key,arr) { //形参
console.log("传入的函数执行",item,key,arr);
})
三、 怎么循环筛选对象数组?
var arr=[
{name:"张一",score:80},
{name:"张二",score:60},
{name:"张三",score:67},
{name:"张四",score:56},
{name:"张五",score:67},
{name:"张六",score:43},
]
// 怎么筛选所有及格学员
var newarr = arr.filter(function(item){
console.log(item); //是每一个对象
return item.score>=60;// 获取每一个对象里的分数大于等于60分;
})
console.log(newarr);//筛选出所有及格的学员对象
四、实现一个myEvery方法达到内置every效果
1.every 的最终结果是和 回调函数 的返还值有关系 ,函数的返还值 就是函数的执行结果。 返还结果不能有false,如果有一个false,那么最终的结果就是false ,其实就是所有结果的 &&(且)关系。
//1. 是一个 && 关系
var arr = [3, 4,5];
var res = true;
for(var i=0;i<arr.length;i++){
res = res && arr[i]; // arr[0] && arr[1] && arr[2]
}
console.log(res); // 就是所有的值为true的时候才是true ,如果有任意一个false 那么结果就是false
var res=ture;
for(var i=0;i<arr.length;i++){
res=res&arr[i]
}
console.log(res);
// 2. 要拿到 回调函数的执行结果
var arr = [2,4,5];
function myEvery(arr,fn) {
var result = true;
for(var i=0;i<arr.length;i++){
// key 就是 i ; item就是arr[i];
// console.log(i,arr[i])
var res = fn(arr[i],i,arr); // 这个就是回调函数的执行结果 也就是传入回调的返还值
// console.log("结果",res);
result = res && result;
}
return result;
}
var res = myEvery(arr,function (item,key,arr) {
console.log("执行了",item,key,arr);
return item>1;//返还结果跟这个返还值有关 决定作用在这儿 都大于1就是true,有一个是flase,那么结果就是flase。
});
console.log(res);//执行了 2 0 (3) [2, 4, 5]
//执行了 4 1 (3) [2, 4, 5]
//执行了 5 2 (3) [2, 4, 5]
//true