繁体   English   中英

在具有从父级传递的参数的函数内部调用时,为什么setTimeout函数记录的日志未定义?

[英]When called inside a function with parameters passed from parent, why is the setTimeout function logging undefined?

我一直在使用javascript中的异步函数setTimeout。 当在一个setTimeout函数而不是另一个setTimeout函数中传递参数时,以下代码给出不同的结果。 有人可以解释吗?

代码1:

console.log("Before");
getUserId(2);
console.log("After");

function getUserId(id){
  setTimeout(() =>{
    console.log(id);
  }, 2000);
}

输出1:

Before
After
2

和,

代码2:

console.log("Before");
getUserId(2);
console.log("After");

function getUserId(id){
  setTimeout((id) =>{
    console.log(id);
  }, 2000);
}

输出2:

Before
After
undefined

如果要将参数传递给callback ,则可以将其放在delay参数之后。 如果您不传递任何参数,那么将在没有任何参数的情况下调用您的回调

setTimeout(function[, delay, param1, param2, ...]);

 console.log("Before"); getUserId(2); console.log("After"); function getUserId(id){ setTimeout((id) =>{ console.log(id); }, 100, id); } 

setTimeout回调中的参数id将是不确定的,除非您像示例一样为它分配默认值

function parentMethod(parentId) {
  setTimeout((id = parentId) => {
    console.log(id);
  }, 2000);
}

检查这一行setTimeout((id = parentId) => {

在这里,我为其分配了默认值,因此它将记录我分配给父方法的所有内容。

因为在示例1中,在getUserId(id)的范围内设置了id,在示例2中,再次在该范围内设置了id,但是随后通过您的匿名函数创建了第二个更窄范围的id。 不需要传递setTimeout()id参数,因为它已经存在于getUserId范围内

在第二个示例中,您将在传递给setTimeout()的回调中重新定义变量id范围。 换句话说,这与以下内容相同:

function getUserId(id){
  setTimeout((some_other_id) => {
    console.log(some_other_id);
    // some_other_id is undefined
  }, 2000);
}

了解id的范围将说明/解决您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM