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

时间:2017-07-21 21:14:55

标签: javascript variables events

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

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的值从事件内部更改为“外部”上下文?

...谢谢

3 个答案:

答案 0 :(得分:2)

您的处理程序会在滚动时触发,a.scrolledfalse,直到您滚动为止。但是,第11行的console.log(a.scrolled)在加载JS时运行,而不是在滚动后运行,因此在脚本开始时会打印false

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

所以你在控制台中看到的是这样的:

false 
true 
true 
true 
true

第一个false输出来自第11行,其余来自第8行,位于处理程序内部。

答案 1 :(得分:0)

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

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

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

在将值打印到控制台之前,更改值不会超时并更改它。

您过去打印的输出不会改变。

答案 2 :(得分:-1)

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

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...