JavaScript函数的参数对它的回调函数不可见吗?

l7wslrjt  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(126)

我想得到这段代码的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);
pcrecxhr

pcrecxhr1#

它与closures有关。
在这个例子中,在setTimeout调用***(2)时,将data的值传递给setTimeout***,该调用稍后将传递给回调,因此您将获得预期的1,3,2输出。
(The回调的参数名称相同,但它是一个独立变量--它与封闭作用域中声明的data不同。)

let data = 1;

console.log(data);

data = 2;
setTimeout((data) => {
  console.log(data);
}, 2000,data);

data = 3;

console.log(data);

只是为了澄清两个data变量之间的区别,这里是相同的实现,参数重命名为:

let data = 1;

console.log(data);

data = 2;
setTimeout((banana) => {
  console.log(banana);
}, 2000, data);

data = 3;
console.log(data);

但是在这种情况下,data参数已经从setTimeout调用中删除,您的回调正在从外部范围引用变量,并且在回调运行时,其值已经更改为3。所以你得到1,3,3

let data = 1;
console.log(data);

data = 2;
setTimeout(() => {   // argument removed from callback function
  console.log(data);
}, 2000,data);

data = 3;
console.log(data);

相关问题