【问题标题】:JavaScript Closure Callback ItselfJavaScript 闭包回调本身
【发布时间】:2015-07-02 16:04:19
【问题描述】:

这是我写的闭包:

var slider = (function(){
    var count = 3;
    return function(){
        if (count>0) {
            $("#message").html("<h1>"+count+"</h1>");
            count--;
            $("#message").removeClass("animated zoomIn");
            $("#message").addClass("animated zoomIn");
            $("#message").one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",  function(){
                return slider();
            }());   
        } else{
            showCube();
        }
    }()
});

这个闭包由一个 jquery 插件执行:

$("#fishes").addClass("animated slideOutLeft").one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", slider());

但是,回调没有被执行。有人可以指导我正确的方向吗?

【问题讨论】:

  • 他为什么要使用slider?他期望slider() 返回one 想要的处理程序。问题在于return 中的(),在倒数第二行中。
  • 不。它不起作用。我尝试更改滑块。我想知道为什么回调无法附加到 dom 元素。
  • 如果有帮助, one('','') 本身就是一个 jquery 插件的处理程序。即,一旦 dom 元素上的动画效果结束,就会触发一个。

标签: javascript jquery callback closures


【解决方案1】:

按照我的阅读方式,您希望slider() 返回一个可用于one 的闭包。但是 - 它没有,因为您的代码存在过早执行综合症。

您的slider 函数创建一个闭包,然后立即执行它,然后返回该执行的结果。由于内部闭包没有return 语句,所以从slider() 返回的值是undefined,而one 没有获取任何要附加的处理程序。

解决方案:从倒数第二行删除()。这应该让slider() 返回一个闭包而不是它的结果。

编辑:您的function() { return slider(); }() 相当于slider(),它构造了一个新的闭包,其中count3。将其替换为 arguments.callee,以提供当前正在执行的相同闭包。

var slider = (function(){
    var count = 3;
    return function(){
        if (count>0) {
            $("#message").html("<h1>"+count+"</h1>");
            count--;
            $("#message").one("click", arguments.callee);   
        } else{
            alert("The End");
        }
    }
});
$('#message').one('click', slider());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="message">Click me!</div>

或者,你可以给它命名,这样你就可以直接引用它:

var slider = (function(){
    var count = 3;
    return function sliderClosure(){
        if (count>0) {
            $("#message").html("<h1>"+count+"</h1>");
            count--;
            $("#message").one("click", sliderClosure);   
        } else{
            alert("The End");
        }
    }
});
$('#message').one('click', slider());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="message">Click me!</div>

【讨论】:

  • 那也没用。我理解过早处决综合症。您能否详细说明为什么应截断自调用部分?
  • 对不起,我不明白你的意思。我认为这正是我所解释的。
  • 我测试了计数值。它下降到 2。但是它没有再进入一个循环。即回调没有再次绑定到dom。
  • 为什么会再次绑定到 DOM?你只执行一次.one,它不在我能看到的任何循环中。事实上,return slider() 是没有用的,因为它会构造一个闭包然后返回它——但是调用者并不关心返回值,所以它被丢弃了。如果您想循环它,请将其替换为对 .one 的另一个调用。
  • 循环位于闭包内。 ("#message") 内容被更改并且新事件被绑定到新内容。循环的退出条件是当 counter
猜你喜欢
  • 1970-01-01
  • 2015-05-22
  • 2013-01-18
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多