这一行:
setTimeout(window.scrollTo(0,leapY), timer * speed);
window.scrollTo
立即调用并将其返回值传递给setTimeout
,就像立即foo(bar())
调用并将其返回值传递给.bar
foo
您需要传入一个函数:
setTimeout(function() { window.scrollTo(0,leapY); }, timer * speed);
但这还不够,因为函数会在运行时leapY
查看值,而不是在定义时查看值,因此它们最终都会使用. 所以你想要一个构建器功能:leapY
setTimeout(buildScroller(leapY), timer * speed);
function buildScroller(y) {
return function() { window.scrollTo(0,y); };
}
在循环中,我们调用leapY
作为y
参数传入的构建器,它返回一个关闭参数的函数(而不是leapY
)。该参数不会改变,因此它构建的函数使用正确的值。
实例| 直播源
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Scrolling On Load In Loop</title>
<style>
div {
height: 200px;
}
</style>
</head>
<body>
<div>Scrolls to each of the first four followingdivs at intervals of one second</div>
<div>0x100</div>
<div>0x200</div>
<div>0x300</div>
<div>0x400</div>
<div>0x500</div>
<div>0x600</div>
<div>0x700</div>
<div>0x800</div>
<div>0x900</div>
<div>0x1000</div>
<div>0x1100</div>
<div>0x1200</div>
<div>0x1300</div>
<div>0x1400</div>
<script>
(function() {
var leapY;
for (leapY = 1; leapY <= 4; ++leapY) {
setTimeout(buildScroller(leapY * 200), leapY * 1000);
}
function buildScroller(y) {
return function() { window.scrollTo(0,y); };
}
})();
</script>
</body>
</html>