在Javascript中,是否可以从事件上下文中更改全局变量的值?
也许这是个愚蠢的问题,但是:在Javascript中,是否可以从事件上下文中更改全局变量的值?,javascript,variables,events,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.scrolle
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的值从事件内部更改为“外部”上下文
谢谢……您的代码确实更改了值,而且它是全局更改的(假设您的代码在全局范围内) 这是因为在更改值时更改了值 更改该值不会使时间回到过去,并在将其打印到控制台之前进行更改
您过去打印的输出没有改变。好的,感谢大家,特别是@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...
处理程序在滚动时触发,
a.scrolled
为false
,直到滚动为止。但是,第11行的console.log(a.scrolled)
在加载JS时运行,而不是在滚动之后运行,因此脚本开始时将打印false
一旦开始滚动,第8行的另一个console.log(a.scrolled)
就会启动
因此,您将在控制台中看到如下内容:
false
true
true
true
true
第一个
false
输出来自第11行,其余来自处理程序内部的第8行。全局变量就是全局变量。你总能找到他们。您可能只需要使用浏览器的全局对象window
来完全限定引用。我想当滚动事件发生时,在那一刻,我最初设置为“false”的全局值会发生变化……我想我明白了您的意思,但您的答案真的很难理解。也许是措辞上的问题,但在我看来,在编程中谈论“时间旅行”只会增加混乱。@AmintaCode-确实如此。更改前打印到屏幕上的输出不会更改。
false
true
true
true
true