JavaScript 闭包回调本身

标签 javascript jquery callback closures

这是我写的闭包:

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() 返回一个可用于 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>

关于JavaScript 闭包回调本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29840912/

相关文章:

javascript - AngularJS:组件树以及如何处理新创建实体的 ID(通过 HTTP)

javascript - 如何仅在 jqplot 中将 y 轴值显示为整数

javascript - 为什么我们需要将 Firefox 驱动程序强制转换为 javascript 执行程序?

javascript - jQuery SlideDown 无法正常工作

callback - 回调如何在纯函数式编程中修改对象的状态?

java - 如何实现Java调用C++的回调函数?

javascript - 如何在线打开Microsoft Office文档?

javascript - 如何使用 live 和 jqueryeach

javascript - Jquery Clickable音频 slider ,在窗口宽度变化上搞砸了

python - 为什么此代码使 Tkinter 窗口不断自动调整大小/增长?