为什么这个关闭没有像我预期的那样工作
Why is this closure not working as I expect it to?
我有以下html和javascript(jQuery):
<div class="container-a">
<div class="element">...</div>
<div class="element">...</div>
...
</div>
<div class="container-b">
<div class="element">...</div>
<div class="element">...</div>
...
</div>
<script>
function cycle($container) {
setInterval(function() {
$active = $container.find(':last-child')
$next = $active.prev();
$next.css({opacity:0});
$next.insertAfter($active);
$next.animate({opacity: 1}, 500, function() {
$active.insertBefore($container.find(':first-child'));
});
}, 3500);
}
$(function() {
cycle($('.container-a'));
cycle($('.container-b'));
})
</script>
当我只在 .container-a 或 .container-b 中的一个上运行 cycle(..) 时,事情工作正常(通过在不透明度转换后将最后一个元素移动到容器的开头,元素一个接一个地淡入淡出)。 但是,当我如上所述在两者上运行循环时,容器 a 中的元素无法正确过渡。
我知道这是因为闭包问题,因为当我单步执行代码时,在某些情况下运行动画完成函数并且$container是 .container-a,但 $active.parent() 和 $next.parent() 是 .container-b。 我很难弄清楚为什么会这样以及如何解决它。
您没有将var
用于任何变量声明,因此它们都是隐式全局变量。您没有使用闭包的变量范围行为,因为您的函数都没有局部变量。
相反,您必须使用 var
:
var $active = $container.find(':last-child')
var $next = $active.prev();
严格模式不允许隐式全局变量。如果将"use strict";
添加到setInterval
回调的顶部(或整个文件的顶部),则会看到未定义$active
的错误。
参见 var 关键字的目的是什么以及何时使用它(或省略它)?
$next是一个全局变量。在此行的开头添加"var":
$next = $active.prev();
相关文章:
- 为什么这在IE中的工作方式与在Firefox中不同
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- 有时 array.length 只在 .push() 之后工作(为什么?)
- Javascript don'刷新页面后无法工作-为什么
- Jquery简单脚本只能在本地工作.为什么?像Javascript翻译
- 可以't让jQuery循环插件工作为什么
- jQuery animate()不工作.为什么?
- window.onload没有'I don’我不能一直工作.为什么?
- Rails自动完成可以在父形式中工作,但不能在嵌套形式中工作.为什么
- LESS不能在IE11中工作-为什么
- ECMAScript的承诺.all方法与jQuery.Deferred一起工作.为什么
- 防止LinkButton post回OnClientClick不工作.为什么
- JavaScript toUpperCase不工作.为什么
- html5:帆布.getImageData不能正常工作-为什么
- javascript的内联样式更改不能在移动浏览器(chrome/dolphin/android)上工作:为什么?
- 为什么我的幻灯片不能工作?为什么我的照片消失了
- jQuery验证在服务器中不起作用!在本地工作.为什么?
- 单页导航无法正常工作.为什么
- AJAX: error(已弃用!)工作,而failed不工作.为什么
- d3选择器:可以在代码中工作,但不能在控制台中工作.为什么