[英]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.