为什么在visualvm(jhat?)oql中使用javascript有时令人困惑?
我很想知道为什么visualvm OQL对以下语句有问题:为什么在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
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