gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 17:26:22 27 4
gpt4 key购买 nike

我很想知道为什么 visualvm OQL 对以下语句有问题:

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

function isTrue(object) {
return true;
}

异常(exception)是:

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

相比之下,visualvm OQL 对以下任何一个例子都没有问题:

示例 1(注意“it”未被引号):

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(出于某种原因在 OQL 中专门处理了“function(it)”?):

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

电话 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

关于javascript - 为什么在 visualvm(jhat?)oql 中使用 javascript 有时会令人困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8460213/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com