【问题标题】:Passing code as function argument in Javascript and that code uses variable defined in the function在 Javascript 中将代码作为函数参数传递,并且该代码使用函数中定义的变量
【发布时间】:2023-03-22 05:34:01
【问题描述】:

我有以下 javascript 代码。我正在尝试在选择表单字段中实现隐藏/显示通用功能。让我们举个例子。假设我有一个选择字段,其中值为“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"});
});

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

【问题讨论】:

  • 你确定你没有把这件事复杂化一点吗?
  • @adeneo,感谢您的参与。我可能会同意您的看法。但这不是重点。我放在这里的只是一个虚拟代码,而实际实现是基于类似的问题。所以让我们找到问题的解决方案:)
  • 把你的 condition 保存为一个字符串然后调用eval() 吗?我假设在调用 selected 时处于调用函数范围内。

标签: javascript jquery closures


【解决方案1】:

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

在这个特定的例子中——也许“block_code”应该被选为一个参数。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这并不奇怪。它之所以有效,是因为您正在使用所有全局变量,这通常不是最好的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多