为什么在visualvm(jhat?)oql中使用javascript有时令人困惑?

为什么在visualvm(jhat?)oql中使用javascript有时令人困惑?,javascript,visualvm,oql,jhat,Javascript,Visualvm,Oql,Jhat,我很想知道为什么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 n

我很想知道为什么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(注:未引用“it”):

例2(注:引用“it”):

例3(“功能(it)”由于某种原因在OQL中专门处理:


我这样问是因为它似乎是非直觉的,非直觉行为的变化会意外地出现,并在我试图创建可用的东西时减慢我的速度。

您的不同语法是不等价的。第一:

select filter(heap.objects("java.util.HashMap"), isTrue(it));
使用参数
it
调用
isTrue
,并将其结果传递给
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

非常感谢你,@nnnnnn。我从您的示例和详细信息中了解了一些有关JavaScript和OQL的内容。例如,@nnnnnn,我应该在示例2中使用(typeof object==“string”)作为我的比较器(根据您的回答,我研究了if语句为什么没有捕获传递的字符串!)。此外,我还在我有缺陷的示例的基础上创建更复杂和有缺陷的语句:filter(数组,ChildOfCyclass(“it”,“referers(it)”)是一个示例,其中ChildOfCyclass被传递了两个参数,我现在可以看出这显然是错误的。我将其更改为使用一个参数,并在不使用参数列表的情况下传递filter ChildOfCyclass。
select filter(heap.objects("java.util.HashMap"), function(it) { return isTrue(it); });

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

function isTrue(object) {  
  return true;  
}

// OR your example 1