gpt4 book ai didi

javascript - 当我引用全局变量时,为什么闭包没有反射(reflect)对原始变量的更改?

转载 作者:行者123 更新时间:2023-12-02 15:42:41 25 4
gpt4 key购买 nike

在我正在开发的应用程序中,我定义了一个全局 App 命名空间,其中存储了一些我想要从不同函数访问的属性。例如,我可能会将菜单 menuOpen 属性存储在我的全局 App 命名空间中,以便我用来处理菜单界面功能的函数可以轻松地与不同的函数共享此信息处理其他事情。

我刚才遇到了一个问题,在用一个函数更新这个全局变量之后,然后在另一个函数的闭包中检查对它的引用,发现引用没有' t 反射(reflect)我的改变。

我在一个简单的示例中重新创建了这个,我希望结果是 false ,因为 baropen 更改为 false,在超时完成并运行针对 state 的检查之前,它应该由 foo 闭包内的 state 反射(reflect):

//set a global variable to be accessed by different parts 
//of an application
var open = true;

//create a closure, which waits for a future event,
//then checks the "open" variable when it occurs
function foo() {

//reference to the global variable "open"
var state = open;

//set a timeout, to reflect "a future event", such
//as an event handler
setTimeout(function() {
if (state) {
$('html').text('true');
} else {
$('html').text('false');
}
}, 1000);
}

//change the "open" global within another function
function bar() {
open = false;
}

//create the closure
foo();

//change "open" to false, before the "if(state)" logic
//is called in the closure
bar();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

据我了解,闭包保留对变量的引用,因此 state 将反射(reflect)对 open 的任何更改。这实际上是如何运作的?我需要做什么不同的事情才能使 foo 的闭包知道 open 的更改?

最佳答案

这与闭包无关。 var x = "a"; var y = x; x =“b”; console.log(y) 输出 "a",而不是 "b",因为 y 的副本x.

闭包不会改变变量的正常行为。闭包只是一个使用周围范围中的局部变量的函数。 foo 是一个闭包,因为它使用 open;传递给 setTimeout 的函数是一个闭包,因为它使用 state (但 state 在设置后永远不会改变)。

您可以通过直接检查if (open)来修复代码。

关于javascript - 当我引用全局变量时,为什么闭包没有反射(reflect)对原始变量的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32449609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com