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 に答える