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

时间:2019-06-17 16:33:52

标签: javascript asynchronous settimeout event-loop asynccallback

我一直在使用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

4 个答案:

答案 0 :(得分:1)

如果要将参数传递给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);
}

答案 1 :(得分:1)

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

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

检查此行 setTimeout((id = parentId) => {

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

答案 2 :(得分:0)

因为在示例1中,在getUserId(id)的范围内设置了id 在示例2中,在该作用域中再次设置了ID,然后通过您的匿名函数创建了第二个较窄的作用域ID。无需传递setTimeout()id参数,因为它已经存在于getUserId范围中

答案 3 :(得分:0)

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

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

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