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

发布于 2024-10-11 16:25:53 字数 316 浏览 4 评论 0原文

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

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

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

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

I tried to define a javascript function in the global block of my ruleset, but when I try to run the function I get 'f() is not defined'.

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

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

What do I need to do to make my function callable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

恬淡成诗 2024-10-18 16:25:53

你的代码应该可以工作。

这是另一个与你的例子相似的例子,它对我有用。

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 上运行应用程序的结果:
替代文本
alt text

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

Your code should be working.

Here is another example similar to yours that is working for me.

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

Results of running app on example.com with bookmarklet:
alt text
alt text

When KRL generates JavaScript to run on the browser's page it puts the code in closures which can create some unexpected behavior. In your code and my example the emitted JavaScript runs in the same scope so the function calls have access to each other. If you have JavaScript watching for a button click which then calls a function emitted in the global block you may have issues with the click function not being in the same scope as the global emitted JavaScript function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文