理解:所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。
1.回调函数
例子:
//第一种方法:匿名函数作为回调函数
var generalLastName = "Cliton";
function getInput(options, callback){
var arr = [];
arr.push(options);
//将全局变量generalLastName传递给回调函数
callback(generalLastName,arr);
}
getInput({name:"Rich",speciality:"Javascript"}, function(generalLastName,arr){
console.log(generalLastName + ":" + arr[0].speciality) // Cliton:Javascript
});
//第二种方法:命名函数作为回调函数
var generalLastName = "Cliton";
function getInput(options, callback){
var arr = [];
arr.push(options);
//将全局变量generalLastName传递给回调函数
callback(generalLastName,arr);
}
function call(generalLastName,arr){
console.log(generalLastName + ":" + arr[0].speciality) // Cliton:Javascript
}
getInput({name:"Rich",speciality:"Javascript"}, call);
为什么函数可以作为另一个函数的参数?
因为函数在Javascript中是第一类对象,我们像对待对象一样对待函数,因此我们能像传递变量一样传递函数,在函数中返回函数,在其他函数中使用函数。当我们将一个回调函数作为参数传递给另一个函数是,我们仅仅传递了函数定义。我们并没有在参数中执行函数。我们并不传递像我们平时执行函数一样带有一对执行小括号()的函数。
需要注意的很重要的一点是回调函数并不会马上被执行。它会在包含它的函数内的某个特定时间点被“回调”(就像它的名字一样)
本文参考:
https://www.jianshu.com/p/40e459cfdc6f
https://blog.csdn.net/qq_22855325/article/details/72958345
宏任务和微任务:
参考:https://juejin.cn/post/6920239138893627406
https://juejin.cn/post/6844903657264136200