我想得到这段代码的1 3 2输出,有和没有usign promises。
let data = 1;
console.log(data);
data = 2;
setTimeout((data) => {
console.log(data);
}, 2000);
data = 3;
console.log(data);
let data = 1;
console.log(data);
data = 2;
setTimeout((data) => {
console.log(data);
}, 2000,data);
data = 3;
console.log(data);
这段代码给出了输出1 3 2,正如预期的那样,但是
console.log(data);
data = 2;
setTimeout(() => { // argument removed from callback function
console.log(data);
}, 2000,data);
data = 3;
console.log(data);
这段代码的输出是1 3 3,为什么呢?为什么这个回调函数没有使用setTimeout中传递的数据agrument。
我也使用了promise,但仍然得到1 3 3作为输出。
let data=1;
console.log(data);
data=2;
temp=new Promise((resolve, reject)=>{
// async code
setTimeout(()=>{
resolve(data);
},2000);
})
temp.then((temp)=>{
console.log(temp);
}).catch((err)=>{console.log(err);}
);
data=3;
console.log(data);
1条答案
按热度按时间pcrecxhr1#
它与closures有关。
在这个例子中,在setTimeout调用***(2)时,将
data
的值传递给setTimeout
***,该调用稍后将传递给回调,因此您将获得预期的1,3,2
输出。(The回调的参数名称相同,但它是一个独立变量--它与封闭作用域中声明的
data
不同。)只是为了澄清两个
data
变量之间的区别,这里是相同的实现,参数重命名为:但是在这种情况下,
data
参数已经从setTimeout调用中删除,您的回调正在从外部范围引用变量,并且在回调运行时,其值已经更改为3。所以你得到1,3,3
。