前端面试 75 道题,看完的人少之又少 (中)( 六 )


在JavaScript中函数也是对象的一种 , 同样对象可以作为参数传递给函数 , 因此函数也可以作为参数传递给另外一个函数 , 这个作为参数的函数就是回调函数 。
const btnAdd = document.getElementById('btnAdd');btnAdd.addEventListener('click', function clickCallback(e) {// do something useless});在本例中 , 我们等待id为btnAdd的元素中的click事件 , 如果它被单击 , 则执行clickCallback函数 。 回调函数向某些数据或事件添加一些功能 。
数组中的reduce、filter和map方法需要一个回调作为参数 。 回调的一个很好的类比是 , 当你打电话给某人 , 如果他们不接 , 你留下一条消息 , 你期待他们回调 。 调用某人或留下消息的行为是事件或数据 , 回调是你希望稍后发生的操作 。
50. Promise 是什么?Promise 是异步编程的一种解决方案:从语法上讲 , promise是一个对象 , 从它可以获取异步操作的消息;从本意上讲 , 它是承诺 , 承诺它过一段时间会给你一个结果 。 promise有三种状态:pending(等待态) , fulfiled(成功态) , rejected(失败态);状态一旦改变 , 就不会再变 。 创造promise实例后 , 它会立即执行 。
fs.readFile('somefile.txt', function (e, data) {if (e) {console.log(e);}console.log(data);});如果我们在回调内部有另一个异步操作 , 则此方法存在问题 。 我们将有一个混乱且不可读的代码 。 此代码称为**“回调地狱”** 。
// 回调地狱fs.readFile('somefile.txt', function (e, data) {//your code herefs.readdir('directory', function (e, files) {//your code herefs.mkdir('directory', function (e) {//your code here})})})如果我们在这段代码中使用promise , 它将更易于阅读、理解和维护 。
promReadFile('file/path').then(data => {return promReaddir('directory');}).then(data => {return promMkdir('directory');}).catch(e => {console.log(e);})promise有三种不同的状态:

  • pending:初始状态 , 完成或失败状态的前一个状态
  • fulfilled:操作成功完成
  • rejected:操作失败
pending 状态的 Promise 对象会触发 fulfilled/rejected 状态 , 在其状态处理方法中可以传入参数/失败信息 。 当操作成功完成时 , Promise 对象的 then 方法就会被调用;否则就会触发 catch 。 如:
const myFirstPromise = new Promise((resolve, reject) => {setTimeout(function(){resolve("成功!");}, 250);});myFirstPromise.then((data) => {console.log("Yay! " + data);}).catch((e) => {...});作者:Mark A 译者:前端小智 来源:dev
【前端面试 75 道题,看完的人少之又少 (中)】原文:#1-whats-the-difference-between-undefined-and-null