Pin*_*est 2 javascript jhat visualvm oql
我有兴趣知道为什么visualvm OQL在以下语句中有问题:
select filter(heap.objects("java.util.HashMap"), isTrue(it));
function isTrue(object) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
例外情况是:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "it" is not defined. (#1)
Run Code Online (Sandbox Code Playgroud)
相比之下,visualvm OQL在以下任何示例中都没有问题:
示例1(注意"它"未引用):
select filter(heap.objects("java.util.HashMap"),
function(it) {
return true;
});
Run Code Online (Sandbox Code Playgroud)
示例2(注意"它"被引用):
select filter(heap.objects("java.util.HashMap"), isTrue("it"));
function isTrue(object) {
if (object instanceof String) {
throw "String passed!";
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
示例3("函数(it)"由于某种原因在OQL中专门处理?):
select filter(heap.objects("java.util.HashMap"), function(it) { return isTrue(it); });
function isTrue(object) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
我问这个是因为它看起来不直观,非直观行为的变化出乎意料地出现,当我试图创造可用的东西时,我放慢了速度.
您的不同语法不相同.首先:
select filter(heap.objects("java.util.HashMap"), isTrue(it));
Run Code Online (Sandbox Code Playgroud)
isTrue使用参数of 调用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
913 次 |
| 最近记录: |