在Javascript中是否可以从事件上下文中更改全局变量的值?



也许这是一个愚蠢的问题,但有:

var a = {
scrolled: false
};
var handler = function() {
a.scrolled = true;
console.log(a.scrolled); // always "true"
};
window.addEventListener('scroll', handler);
console.log(a.scrolled); // always "false"

没有机会将 a.scrolled 的值从事件内部更改为"外部"上下文?

谢谢。。。。

您的处理程序在滚动时触发,并且在您滚动之前falsea.scrolled。但是,第 11 行的console.log(a.scrolled)在加载 JS 时运行,而不是在滚动后运行,因此在脚本开始时将打印false

一旦你开始滚动,你在第8行的其他console.log(a.scrolled)就会启动。

因此,您将在控制台中看到如下所示:

false 
true 
true 
true 
true

false输出来自第 11 行,其余来自处理程序内部的第 8 行。

您的代码确实会更改该值,并且它会全局更改(假设您的代码在全局范围内(。

console.log(a.scrolled); // always "false"

这是因为您在更改值时会更改值。

更改该值不会时间旅行到过去,也不会在将其打印到控制台之前对其进行更改。

过去打印的输出不会更改。

好的,感谢所有人,特别是@patrick-罗伯茨为我指出了正确的例子。这是一个异步代码引用的问题,但我会保留这个问题/答案作为示例,因为我认为更简单。

var a = {
scrolled: false
};
var handler = function() {
a.scrolled = true;
};
window.addEventListener('scroll', handler);
setTimeout(function() {
console.log(a.scrolled)} 
, 10000);
// a.scrolled is kept "false" if, in 10 seconds, no scroll event happens...

最新更新