在jQuery中对匿名函数进行去匿名化

时间:2011-02-23 19:27:28

标签: javascript jquery

这可能是一个非常简单的问题,但它让我头疼,所以我在这里发帖。

我有以下形式的jQuery:

if (jQuery('.SearchRegions:checked').length == 0) { 

jQuery('.SearchRegions').each(function(){

        //code

    });

} else {

jQuery('.SearchRegions:checked').each(function(){

        //the same code     

    });

}

显然,在每个函数中重复一大段代码似乎很荒谬。但是当我试图命名并移动函数时,它似乎都崩溃了 - 可能是因为函数内部的范围和/或jQuery(this)问题不再引用同一个对象?

任何人都可以通过发布我的代码应该是什么样子的一般概念来帮助我吗? (或任何其他优化或重新设计使其工作将非常感激!)

3 个答案:

答案 0 :(得分:3)

您绝对可以定义一个函数并按名称使用它:

function someHandler(event) {
  // code code code
}

jQuery('.SearchRegions').each(someHandler);

请注意,当您按名称引用该功能时,包含“()”。

答案 1 :(得分:3)

假设闭包确实是问题,您可以参数化“匿名”函数以将这些值传递给它。例如:

function eachRegion(values, $container, foo) {
    // common code which uses scope variables `values`, `$container`, and `foo`
}

// elsewhere, in code defining `values`, `$container`, and `foo`...

if (jQuery('.SearchRegions:checked').length == 0) { 
    jQuery('.SearchRegions').each(function(){
        eachRegion(values, $container, foo);
    });
} else {
    jQuery('.SearchRegions:checked').each(function(){
        eachRegion(values, $container, foo);
    });
}

答案 2 :(得分:0)

您可以将函数定义为变量,并在每个方法调用中使用它。

var yourEachFunction = function(){$("ul").append("<li>" + $(this).val() + "</li>");}

if (jQuery('.SearchRegions:checked').length == 0) {
    jQuery('.SearchRegions').each(yourEachFunction );
} else {
    jQuery('.SearchRegions:checked').each(yourEachFunction );
}

这项工作的示例jsfiddle