也许这是一个愚蠢的问题,但是:
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的值从事件内部更改为“外部”上下文?
...谢谢
答案 0 :(得分:2)
您的处理程序会在滚动时触发,a.scrolled
为false
,直到您滚动为止。但是,第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...