Почему использование javascript в visualvm (jhat?) Oql иногда сбивает с толку? - PullRequest
2 голосов
/ 11 декабря 2011

Мне интересно знать, почему в Visualvm OQL возникает проблема со следующим утверждением:

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

Я спрашиваю об этом, потому что это кажется не интуитивным и появляются варианты неинтуитивного поведениянеожиданно и замедляет меня, когда я пытаюсь создать что-то полезное.

1 Ответ

5 голосов
/ 11 декабря 2011

Ваши разные синтаксисы не эквивалентны. Первый:

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

вызывает isTrue с параметром it и передает свой результат в функцию filter(). В этот момент у вас не определена переменная it, следовательно, ошибка.

Ваши "пример 1" и "пример 3" передают функцию в качестве второго параметра функции 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
...