我一直在使用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
答案 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
的范围将说明/解决您的问题。