2

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

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

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

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

4

1 回答 1

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");
        }
      |>;
    }
  }
}

在 example.com 上使用书签运行应用程序的结果: 替代文字 替代文字

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

于 2011-01-11T18:38:47.610 回答