在JavaScript中传递代码作为函数参数,并且该代码使用函数中定义的变量

问题描述:

我有以下JavaScript代码。我试图在选择表单域中实现隐藏/显示通用功能。让我们举个例子。假设我有一个select域,其值为“none”,“auth”,“other”,如果用户选择“auth”,则显示另一个表单域。对于不同的选择领域,我可能会在很多地方出现这种情况。因此,我写了下面profile_field_toggler在JavaScript中传递代码作为函数参数,并且该代码使用函数中定义的变量

function escapeJquerySelectorStr(str) { 
    if (str) { 
    return str.replace(/([ #;?&,.+*~\':"!^$[\]()=>|\/@])/g,'\\$1');  
    } 
    return str; 
} 

function profile_field_toggler (cotroller_id, reciever_id, block_code) { 
    parsed_controller_id = "#"+escapeJquerySelectorStr(cotroller_id); 
    parsed_reciever_id = "#"+escapeJquerySelectorStr(reciever_id); 
    selected = jQuery(parsed_controller_id + " option:selected").val(); 
    if(block_code()) { 
    jQuery(parsed_reciever_id).removeClass("hide"); 
    } else { 
    jQuery(parsed_reciever_id).addClass("hide"); 
    } 
} 

这个功能在这里,我拨打电话到即profile_field_toggler通用功能。泛型函数的最后一个参数接受条件代码,所以我将它传递给selected == "auth"以下的调用。但selected没有在这个调用范围,因此它不会工作(因为我想引用泛型函数中选定的变量)。那我该如何解决这个问题呢?请注意,我必须仅在呼叫方中保留诸如selected == "auth"selected != "xyz"selected == "undefined"的条件,因为它们可能会有所不同。

jQuery(document).ready(function() { 
    profile_field_toggler("base[remove_option]", "general_passwordassword_block", function() {selected == "auth"}); 
}); 

任何想法如何解决这个问题?

+0

你确定你不会让这个有点太复杂吗? – adeneo 2015-02-23 17:44:44

+0

@adeneo,感谢您的支持。我可能会同意你的意见。但这不是重点。我在这里只是一个虚拟代码,而实际的实现是基于类似的问题。因此,让我们找到问题的解决方案:) – JVK 2015-02-23 17:49:34

+0

将*条件*保留为字符串,然后调用'eval()'?我假设在调用'selected'时处于调用函数范围。 – 2015-02-23 17:52:09

闭包只能访问自己范围内的变量,但绝对不会(也不能)知道最终调用它的函数的范围。

在这个特殊的例子中 - 或许“block_code”应该被选作参数。

它看起来很奇怪,但我找到了解决方案。看来你只能在来自调用者的调用中传递selected,即使它在通用函数中定义,它也可以工作。看一下这个。我刚刚添加return,以便可以评估条件。它的工作。我测试了所有不同的条件,它正在工作..甜,但很奇怪。

jQuery(document).ready(function() { 
    profile_field_toggler("base[remove_option]", "general_passwordassword_block", function() {return(selected == "auth")}); 
}); 
+0

这并不奇怪。它的作用是因为你使用了所有的全局变量,这通常不是最好的想法。 – Pointy 2015-02-23 22:51:02