Skip to content

回调函数

一、回调函数-callback

回调函数就是一个被作为参数传递的函数。

js
// 把函数 b 当作参数传递到 函数 a 中
// 在函数 a 中以行参的方式进行调用
function a(cb) {
  cb()
}

function b() {
  console.log('我是函数 b')
}

a(b)

之前我们接触过很多类似的形式

例如:数组的方法 forEach() 、filter() 、map() 等方法都是传入一个函数作为参数,这其实就是回调函数

分析 forEach() 的实现

forEach() 使用

js
var arr = [34,71,85];
arr.forEach(function(v,i,a){
    console.log(v,i,a); // 34 0 [34, 71, 85]
						// 71 1 [34, 71, 85]
						// 85 2 [34, 71, 85]
});

其实底层还是把数组循环了一遍,并且在回调函数中传递每个数组的值和索引和数组本身

普通方法仿写froEach()

js
// 封装
function forEach(arr,fn){
    for(let i=0;i<arr.length;i++){
        fn(arr[i],i,arr);
    }

}

// 调用
forEach(arr,function(v,i,a){
    console.log(v,i,a); // 34 0 [34, 71, 85]
						// 71 1 [34, 71, 85]
						// 85 2 [34, 71, 85]
});

这里个和上面用forEach()的输出完全一致

只不过在调用方法和上面的不一样,

在Array的原型里仿写forEac()

js
// 原型方法中的this指向实例对象
// 调用
Array.prototype._forEach = function(fn){
	for(let i=0;i<this.length;i++){
		fn(this[i],i,this);
	}
}

// 调用
arr._forEach(function(v,i,a){
	console.log(v,i,a); // 34 0 [34, 71, 85]
						// 71 1 [34, 71, 85]
						// 85 2 [34, 71, 85]
});

仿写filter()

js
let arr = [1, 2, 3, 4]
Array.prototype._filter = function (cb) {
    let newArr = []
    let flag = null
    for (let i = 0; i < this.length; i++) {
        flag = cb(this[i], i, this)
        if (flag) {
            newArr.push(this[i])
        }
    }
    return newArr
}

let arr2 = arr._filter((item, index, arr) => {
    return item > 2
})
console.log(arr2);      //[3,4]

仿写map()

js
let arr1 = [1,2,3,4,5];

Array.prototype._map=function(cb){
    let newArr=[]
    let flag=null
    for(let i=0;i<this.length;i++){
        flag = cb(this[i],i,this)
        if(flag){
            newArr.push(flag)
        }
    }
    return newArr
}

let arr3 = arr1._map(function (value, index, arr) {
    //参数1:数组的值;参数2:值的下标;参数3:数组本身
    return value*2;
});
console.log(arr3); // [2,4,6,8,10]

二、ajax封装

js
/**
         * 封装 ajax请求
         * @date 2022-09-13
         * @param {请求方式get或post} method
         * @param {请求接口地址} url
         * @param {同步异步} any
         * @param {object参数} data
         * @param {回调函数} callback
         * @returns {没有返回值undefined}
         */
function $ajax(method, url, any, data, callback) {
    let queryMsg = '?'
    for (let i in data) {
        queryMsg += i + '=' + data[i] + '&'
    }
    queryMsg = queryMsg.substr(0, queryMsg.length - 1)
    let xhr = new XMLHttpRequest()
    //get方法,有参和无参
    if (method === 'get') {
        xhr.open('get', url + queryMsg, any)
    } else {
        xhr.open('post', url, any) 
    }
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                let res = JSON.parse(xhr.responseText)
                callback(res)
            }
        }
    }
    if (method === 'get') {
        xhr.send(null)
    } else {
        xhr.setRequestHeader('content-type', 'application/json');
        xhr.send(JSON.stringify(data));
    }

}

MIT Licensed