函数也是一种数据类型,既可以当做参数传递,也可以当做方法值返回,函数在js中是一等公民。
一般情况下,把函数作为参数的目的就是为了获取函数内部的异步操作结果。
常见的异步api setTimeout setInterval ajax Promise
与异步编程相对的是 同步编程
console.log(1) function add(x,y){ console.log(2) return (x+y) } console.log(add(10,20)); console.log(3) // 返回结果 1 2 30 3
异步编程
console.log(1) setTimeout(function(){ console.log(2); console.log("hello") },100) console.log(3) // 返回结果 1 3 2 hello
异步函数 -- 输出返回值 不成立情况 -- 第一种
function sum(x,y){ console.log(1) setTimeout(function(){ console.log(2) var resault = x + y; return resault; // 这里的return值拿不到 },100) console.log(3) // 函数到此就执行结束,不会等待前面的定时器,所以姐直接返回了默认值undefined } console.log(sum(10,20)) // 1 3 undefined 2
第二种不成立情况
function sum(x,y){ var resault; console.log(1) setTimeout(function(){ console.log(2) resault = x + y; },100) console.log(3) return resault; //定时器还没有执行到 } console.log(sum(10,20)) // 1 3 undefined 2
第一种使用可以拿到值得情况,此方式只是助于理解异步,一般不用于实际开发
var res ; function sum(x,y){ console.log(1); setTimeout(function(){ console.log(2); res = x+y; },100) console.log(3) } sum(10,20); setTimeout(function(){ console.log("res",res) },2000); // 此处的时间必须要大于前面的延时器时间
第二种可以拿到值的方法 -- 使用回调函数
function sum(x,y,callback){ /* callback 就是回调函数 --> var x = 10; var y = 100; var callback = function(){} */ console.log(1); setTimeout(function(){ console.log(2) var resault = x + y; callback(resault); },200) console.log(3) } sum(10,100,function(resault){ console.log(resault)// 将函数当做参数获取返回值 })
回调函数案例
function getajax(url,callback){ let xhr = new XMLHttpRequest(); xhr.open('get',url,true); xhr.send(); xhr.onreadystatechange = function(){ if(xhr.readyState === 4 && xhr.status === 200 ){ console.log(xhr.responseText); // 回调函数的调用 callback(xhr.responseText) } } } // 函数调用 getajax('url',function(data){ console.log(data) // 此处可以拿到异步获取的数据 })