javascript - 使用递归而不是 EVAL

标签 javascript jquery recursion eval

我有一个页面中的项目列表,必须按顺序隐藏,但就在前一个项目完全隐藏之后。

我编写了以下代码,我在其中创建了一个大字符串,将回调插入到先前的回调中,然后使用 eval 执行效果,但尽管代码按预期运行良好,但我完全确定这不是最好的方法来做到这一点。

// get items to hide
    var itemsToHide = jQuery(".hide");

// function responsible to hide the item
    var hideItem = function (item, callback) {
     jQuery(item).hide(100, callback)
    };

// declare an empty function, to be the first to be called
    var buff = function(){};

    for (var i = 0; i < itemsToHide.length; i++) {
// put the previous value of buff in the callback and assign this to buff
     buff = "function(){hideItem(itemsToHide[" + i + "], " + buff + ");}";
    }

// execute the effects
    eval("(" + buff + ")()");

关于如何在没有“邪恶”评估的情况下使用递归实现此效果的任何建议?

最佳答案

用递归隐藏 - 函数式风格

在这种情况下,您知道效果的持续时间,因此您可以按照其他人的建议进行操作。

但是,您可能仍然想知道如何使用更实用的样式,使用简单的递归来实现相同的目的。

所以我在这里向您展示一种方法。

1。代码

<script src="http://code.jquery.com/jquery-latest.pack.js"></script>
<script type="text/javascript">
    $(function() {
        var items = jQuery(".to-hide");
        (function hideRec() {
            if (items.length == 0) {
                window.alert("The end.");
                return;
            }
            var toHide = jQuery(items[0]);
            items = items.slice(1);
            toHide.hide("100", hideRec);
        })();
    });
<script>

<ul>
    <li class="to-hide">...</li>
    <li class="to-hide">...</li>
    <li class="to-hide">...</li>
    <li class="to-hide">...</li>
    <li class="to-hide">...</li>
<ul>

2。它是如何工作的?

我们首先从 jQuery 获取一个数组,其中包含我们希望隐藏的对象。

然后我们创建一个命名的匿名函数,它将在其定义后立即执行——它是 (function() { ... })(); 模式.即使它是一个匿名函数,我们也会给它起一个名字,以便我们能够轻松地递归调用它。

请注意,您可以在不给匿名函数命名的情况下实现相同的目的——如果您不了解 JavaScript 如何处理作用域,这听起来可能有点奇怪——使用更晦涩的版本:

(function() {                            // Anonymous function without a name
    if (items.length == 0) {
        window.alert("The end.");
        return;
    }
    var toHide = jQuery(items[0]);
    items = items.slice(1);
    toHide.hide("100", arguments.callee); // Recursive call to anonymous function
})();

这次我们使用了 arguments.callee 代表函数本身的事实——所以不需要给匿名函数一个名字。

整个魔法都在这个递归匿名函数中——这是一个闭包。

hideRec 匿名函数捕获items 数组。在检查里面还有东西之后,它会删除第一个元素并将其存储在本地 toHide 变量中(用 jQuery 正确包装)。

最后,它使用 jQuery 隐藏元素,并将这个匿名函数作为回调传递——jQuery 将在完成效果后再次调用它。

我希望这已经足够清楚了。

祝你好运!

关于javascript - 使用递归而不是 EVAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1750168/

相关文章:

javascript - 如何在for循环中添加DOM元素

javascript - 将函数作为回调传递给函数

javascript - 使这个 jQuery Ajax async=true 带有闭包

scala - Scala中的整数到二进制

JavaScript switch 语句只执行默认情况

javascript - meteor 错误: ENOTEMPTY: directory not empty

javascript - 如何在 JavaScript 中获取 HTML 元素的水平滚动百分比?

javascript - Google Chrome 中的 CSS3 径向渐变渲染

javascript - 递归函数查找给定 id 的顶级父级

python - 递归计算表达式python