Как вызвать функции JavaScript, определенные в глобальном блоке моего набора правил KRL? - PullRequest
2 голосов
/ 11 января 2011

Я пытался определить функцию javascript в глобальном блоке моего набора правил, но когда я пытаюсь запустить функцию, я получаю 'f () не определено'.

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

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

Что мне нужно сделать, чтобы моя функция вызывалась?

1 Ответ

2 голосов
/ 11 января 2011

Ваш код должен работать.

Вот еще один пример, аналогичный вашему, который работает для меня.

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 с букмарклетом: alt text alt text

Когда KRL генерирует JavaScript для запуска на странице браузера, он помещает код в замыкания, что может привести к неожиданному поведению.В вашем коде и моем примере испускаемый JavaScript работает в одной области видимости, поэтому вызовы функций имеют доступ друг к другу.Если у вас есть JavaScript, отслеживающий нажатие кнопки, которое затем вызывает функцию, генерируемую в глобальном блоке, у вас могут возникнуть проблемы с тем, что функция щелчка не находится в той же области действия, что и глобально генерируемая функция JavaScript.

...