[英]Basic JavaScript, why is this function not passing the parameter
我正在尝试学习来自 C# 的 JavaScript。 我写了这个简单的代码,但由于某种原因,参数没有传递给 setTimeout 函数。
function displayName(name) {
console.log(`Name is ${ name }`);
}
function login(name) {
// The argument 'name' is not being passed from the login function to the setTimeout !!
setTimeout(name =>{
displayName(name)
}, 2000);
}
login("Satoshi")
我希望输出是: Name is Satoshi
相反,我得到: Name is undefined
我哪里错了? 很明显,我对 JavaScript 参数和范围有一些不了解。
参数“名称”没有从登录函数传递给 setTimeout !!
那是因为您使用箭头函数的参数隐藏了login
name
参数。 函数参数列表中的参数名称类似于函数体内的变量声明,因此您的原始代码具有外部name
(在login
)和单独的内部name
(在箭头函数中)。 最里面的一个是当您使用参数(或变量)的名称时使用的那个。
将箭头函数中的name
替换name
()
,这样它就不会声明自己的name
参数; 然后它将关闭login
的name
参数:
function login(name) {
setTimeout(() =>{
// −−−−−−−−−−−−^^
displayName(name);
}, 2000);
}
默认情况下,浏览器上的setTimeout
不会使用任何参数调用您提供的函数,因此原始代码中箭头函数中的name
参数将始终具有值undefined
。
在某些情况下,您可能希望setTimeout
在调用时将一个或多个参数传递给计时器回调,您可以通过在超时间隔之后传递这些参数来实现,如下所示:
function login(name) {
setTimeout(innerName =>{
// ^^^^^^^^^−−−−−−−− the arrow function's parameter
displayName(innerName);
// ^^^^^^^^^−−− using the arrow function's parameter's value
}, 2000, name);
// ^^^^−−−−−−−−−−−−−−− `login`'s `name`
}
但是在您的示例中不需要这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.