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

时间:2015-02-23 17:41:14

标签: javascript jquery closures

我有以下javascript代码。我试图在选择表单字段中更改隐藏/显示通用函数。让我们举个例子。假设我有一个select字段,其中值为“none”,“auth”,“other”,如果用户选择“auth”,则显示另一个表单字段。对于不同的选择字段,我可能在形式中有很多地方。因此我在profile_field_toggler

下写了这个函数
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"});
});

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

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

在这个特定的例子中 - 或许" block_code"应该选择作为参数。

答案 1 :(得分:0)

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

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