2

visualvmOQLに次のステートメントで問題がある理由を知りたいです。

select filter(heap.objects("java.util.HashMap"), isTrue(it));

function isTrue(object) {  
  return true;  
}

例外は次のとおりです。

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "it" is not defined. (#1)

対照的に、visualvm OQLには、次のどの例でも問題はありません。

例1(「それ」は引用されていないことに注意してください):

select filter(heap.objects("java.util.HashMap"),  
    function(it) {  
      return true;  
    });

例2(「それ」が引用されていることに注意してください):

select filter(heap.objects("java.util.HashMap"), isTrue("it"));  

function isTrue(object) {  
  if (object instanceof String) {  
    throw "String passed!";  
  }  
  return true;  
}

例3(「function(it)」は何らかの理由でOQLで特別に処理されますか?):

select filter(heap.objects("java.util.HashMap"), function(it) { return isTrue(it); });

function isTrue(object) {  
  return true;  
}

直感的ではないようで、直感的でない動作のバリエーションが予期せず表示され、使用可能なものを作成しようとすると速度が低下するため、これを尋ねます。

4

1 に答える 1

5

異なる構文は同等ではありません。最初:

select filter(heap.objects("java.util.HashMap"), isTrue(it));

isTrueのパラメータを指定して呼び出し、その結果を関数にit渡します。その時点では、変数が定義されていないため、エラーが発生します。filter()it

「例1」と「例3」はどちらも、関数の2番目のパラメーターとして関数を渡しfilter()ます。渡す関数は、(おそらく)呼び出すコールバックとして意図されておりfilter()、パラメーターitはによって設定されfilter()ます。

「例2」は、isTrue("it")すぐに呼び出すという点で最初のコードに少し似ていますが、この場合は文字列リテラルで呼び出しているため、パラメータが未定義であることに問題はありません。ただし、これfilter()も関数自体を渡すのではなく、関数の結果をパラメーターとしてに渡します。

の正しい使用法は、関数(関数参照(括弧filter()なしの関数の名前)または「例1」のような関数式)を渡すことです。したがって、次のことを試してください。

select filter(heap.objects("java.util.HashMap"), isTrue);

function isTrue(object) {  
  return true;  
}

// OR your example 1
于 2011-12-11T00:39:21.733 に答える