繁体   English   中英

将参数传递给函数时,setTimeout无法正常工作

[英]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设置为truefalse ,但是它不知道外部哪个变量具有该值,因此无法更改其值。

一种解决方案是将变量存储在一个对象中,然后告诉changeBoolean要更改的

var variables = {
    someVariable: true
};

function changeBoolean(argument) {
    variables[argument] = false;
}

setTimeout(function(){
    changeBoolean('someVariable');
},1000);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM