面试题答案
一键面试闭包误区分析
- 在上述代码中,
inner
函数形成了闭包,它可以访问outer
函数作用域中的data
变量。但是,getData
是一个异步操作,then
回调中的data = result
语句是在return data
执行之后才会被调用。所以当return data
执行时,data
仍然是undefined
,因为异步操作还未完成。
正确实现方式
- 使用async/await:
function getData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('异步数据');
}, 1000);
});
}
function outer() {
async function inner() {
const data = await getData();
return data;
}
return inner;
}
const func = outer();
func().then(console.log);
- 使用.then链式调用:
function getData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('异步数据');
}, 1000);
});
}
function outer() {
function inner() {
return getData();
}
return inner;
}
const func = outer();
func().then(console.log);
在这两种方式中,async/await
方式更直观,它让异步代码看起来像同步代码;.then
链式调用则是Promise的基本使用方式,通过返回Promise来确保异步操作完成后再处理数据。