[英]setTimeout is not working when I pass a parameter into the function
我决定制作一个简单的画布游戏,并在延迟后将布尔变量更改为false
(从true
)。 我做了一个简单的函数,看起来像这样:
var someVariable = true;
function changeBoolean(){
someVariable = false;
}
setTimeout(changeBoolean, 1000);
。 。 。 而且效果很好。 但是我的游戏越来越大,我不想为每个变量都做额外的功能,所以我想出了一种方法来做到这一点:
var someVariable = true;
function changeBoolean(argument) {
argument = false;
}
setTimeout(changeBoolean(someVariable),1000);
。 。 。 而且不起作用。 有人可以告诉我我在做什么错吗? 感谢帮助。
问题在于JavaScript是通过值传递的,而不是通过引用传递的。 这意味着通过更改argument
,您不会更改someVariable
。
从更技术的角度来看,JavaScript对函数中的变量使用了一种称为“变量环境”(认为是局部作用域)的东西。 一旦合并范围关闭,此环境中的值将不会持久化到Lexical Environment(认为是全局范围)。
JavaScript用作执行上下文ECMA的堆栈,以保持其作用域,如果您想了解有关作用域结构的更多信息,那是一个不错的起点。
除了@RocketHazmat指出的作用域之外,为了使setTimeout
工作,需要将其传递给函数进行调用。 您的示例代码正在传递函数调用的结果,并且没有返回值,因此从本质上讲,这只是setTimeout(undefined,1000)
,将无法正常工作。
请参阅Rocket的解释以获取有关建议调用setTimeout的建议,这实际上就是我在这里要介绍的内容。
您需要通过setTimeout
函数来调用。 这就是您在第一个示例中所做的,您正在将它传递给作为函数的changeBoolean
。
在第二个示例中,您将调用 changeBoolean(someVariable)
,然后将其返回值undefined
传递给setTimeout
。
您可以改为传递匿名函数 :
setTimeout(function(){
changeBoolean(someVariable);
},1000);
尽管someVariable
将通过值传递,但这实际上将不起作用,因此,所有changeBoolean
将看到argument
设置为true
或false
,但是它不知道外部哪个变量具有该值,因此无法更改其值。
一种解决方案是将变量存储在一个对象中,然后告诉changeBoolean
要更改的键 :
var variables = {
someVariable: true
};
function changeBoolean(argument) {
variables[argument] = false;
}
setTimeout(function(){
changeBoolean('someVariable');
},1000);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.