如何调用KRL规则集的全局块中定义的javascript函数?

时间:2011-01-11 05:14:51

标签: krl

我试图在我的规则集的全局块中定义一个javascript函数,但是当我尝试运行该函数时,我得到'f()未定义'。

global {
  emit <|
    function f() { return 42 };
  |>;
}

rule use_function {
  select when pageview ".*"
  { 
    emit <| result=f(); console.log("The value is "+result+"."); |>;
  }
}

要使我的函数可调用,我需要做什么?

1 个答案:

答案 0 :(得分:2)

您的代码应该正常运行。

这是另一个与你相似的例子。

ruleset a60x535 {
  meta {
    name "function-scope-test"
    description <<
      function-scope-test
    >>
    author "Mike Grace"
    logging on
  }

  global {
    emit <|
      function showMeTheMoney() {
        alert("42!");
        return 42;
      }
    |>;
  }

  rule call_global_function {
    select when pageview ".*"
    {
      emit <|
        var amount = showMeTheMoney();
        alert("amount: "+amount);
        function cool() {
          alert("yes");
        }
      |>;
    }
  }
}

使用bookmarklet在example.com上运行app的结果: alt text alt text

当KRL生成JavaScript以在浏览器页面上运行时,它会将代码置于闭包中,从而产生一些意外行为。在您的代码和我的示例中,发出的JavaScript在相同的范围内运行,因此函数调用可以相互访问。如果您正在查看按钮单击的JavaScript,然后调用全局块中发出的函数,则可能会遇到点击函数与全局发出的JavaScript函数不在同一范围内的问题。