在循环中生成JS函数

时间:2013-04-17 13:13:28

标签: javascript jquery loops

我想在循环中生成js函数,但我有问题。拜托,有人能告诉我的想法是对的吗?可以在循环中生成函数吗?

var sortItems =
                    ["sortable11","sortable12","sortable13","sortable14","sortable15",
                    "sortable21","sortable22","sortable23","sortable24","sortable25",
                    "sortable31","sortable32","sortable33","sortable34","sortable35",
                    "sortable41","sortable42","sortable43","sortable44","sortable45",
                    "sortable51","sortable52","sortable53","sortable54","sortable55"];
                for ( key in sortItems) {
                    $(function(){
                        $('#' + sortItems[key]).sortable({
                            update: function(event, ui)
                            {
                                $.ajax({
                                    type: "POST",
                                    url: "fun/saveOrder.php",
                                    dataType: "text",
                                    data: 
                                        {
                                        key:$(this).sortable('toArray')
                                    },
                                    cache: false,
                                    beforeSend: function(){$('#updateResult').html('updating');},
                                    success: function(data){$('#updateResult').html(data);},
                                    error: function(data){$('#updateResult').html(data);}
                                })
                                recalculate();
                            }
                        })
                    })
                }

3 个答案:

答案 0 :(得分:0)

从语法上讲,在JavaScript循环中生成函数是完全没问题的。

不推荐使用:如果你有大量的对象,生成大量的闭包(这就是你正在创建的匿名函数被调用)可能会很慢。但我怀疑你会遇到这种情况。

不建议使用的另一个原因是您在函数中使用的key变量是var的引用,它是完全相同的变量闭包的外部,从而使你的循环在实践中完全无用。也许检查一下this question,它可能会有所帮助。

如果不了解您所面临的问题,就很难说更多。

答案 1 :(得分:0)

如果您首先生成DOM元素数组,则可以删除for循环:

var sortItems = ["sortable11","sortable12","sortable13","sortable14","sortable15",
                    "sortable21","sortable22","sortable23","sortable24","sortable25",
                    "sortable31","sortable32","sortable33","sortable34","sortable35",
                    "sortable41","sortable42","sortable43","sortable44","sortable45",
                    "sortable51","sortable52","sortable53","sortable54","sortable55"],
sortElements = $.map(sortItems, function(id) {
    return document.getElementById(id);
});

$(sortElements).sortable({
   // your options here
});

此外,您的循环在每次迭代时都在执行$(function() { ... };它只需要一次,因此您可以将其包裹在代码上方(或将此代码移动到<body>元素的末尾。

答案 2 :(得分:0)

可以在循环中生成/创建函数。其中一种方法可以做到:

var test = ['name','phone','address'];
var test2 = [];
$.each(test,function(k,v){ test2[k] = function(){alert(v)}});

test2[0]; //alerts 'name'
test2[1]; //alerts 'phone'
test2[2]; //alerts 'address'