我正在尝试学习来自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
)和一个单独的内部(在箭头函数中)。最里面的一个是使用参数(或变量)名称时使用的那个。
在arrow函数中替换name
为()
,因此它不会声明自己的name
参数;然后它将关闭name
参数login
:
function login(name) {
setTimeout(() =>{
// −−−−−−−−−−−−^^
displayName(name);
}, 2000);
}
默认情况下,setTimeout
在浏览器上不会调用您为其提供任何参数的函数,因此name
原始代码中arrow函数中的参数将始终具有value 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`
}
但是在您的示例中不需要这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句