js四种异步方法(回调函数、Promise、Generator、async/await)
1,回调函数
函数B作为函数A的入参,且函数A执行了函数B,此时我们把函数A叫做回调函数。
function A(callback){ console.log("A"); callback("param B");//函数A执行了函数"B",给函数"B"入参"param B" } A((val) => { //函数"B"作为函数A的入参,"B"有一个入参val console.log(val);//输出"param B" })
$(dom).click(function() { console.log("我是回调函数"); })
2,闭包
在函数A内部定义一个函数B,函数B访问了函数A的变量,对于A来说,B形成了闭包。闭包:一个访问了父级及以上的作用域变量的函数。闭包实现了变量私有化和访问私有变量。
function A(){ let a = 1; return function () { console.log(a + 1); } } let a = A(); //a是一个闭包 a(); //输出2
函数自身调用,也可以写成:
let a = (function (){ let a = 1; return function () { console.log(a + 1); } })(); a(); //输出2
被闭包访问的作用域变量会一直存在于内存中,不会被JS的垃圾回收机制回收,造成内存泄漏。
闭包不是回调,回调也不是闭包,回调是函数内执行另一个函数,闭包是函数内返回另一个函数,且返回了父级函数的作用域变量
function A(){ let a = '这是' return () => { console.log(a += '闭包'); } } let a = A(); a(); a();
输出:
function A(callback){ let a = '这是' callback(a += '回调'); } A((val) => { console.log(val); }) A((val) => { console.log(val); })
输出: