首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在visualvm中使用javascript (jhat?)oql有时会让人困惑吗?

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

Stack Overflow用户
提问于 2011-12-11 05:56:47
回答 1查看 998关注 0票数 2

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

代码语言:javascript
复制
select filter(heap.objects("java.util.HashMap"), isTrue(it));

function isTrue(object) {  
  return true;  
}

例外情况是:

代码语言:javascript
复制
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "it" is not defined. (#1)

相比之下,visualvm OQL在以下任何示例中都没有问题:

示例1(注意"it“未加引号):

代码语言:javascript
复制
select filter(heap.objects("java.util.HashMap"),  
    function(it) {  
      return true;  
    });

示例2(注意引号"it“):

代码语言:javascript
复制
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中由于某种原因而被特殊处理?):

代码语言:javascript
复制
select filter(heap.objects("java.util.HashMap"), function(it) { return isTrue(it); });

function isTrue(object) {  
  return true;  
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-11 08:39:22

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

代码语言:javascript
复制
select filter(heap.objects("java.util.HashMap"), isTrue(it));

使用参数it调用isTrue,并将其结果传递给filter()函数。此时,您还没有定义变量it,因此出现了错误。

"example 1“和"example 3”都将一个函数作为第二个参数传递给filter()函数。您传入的函数(可能)用作filter()将调用的回调,其中参数it将由filter()设置。

您的“示例2”有点像第一个代码,因为它立即调用isTrue("it"),但在本例中,它使用字符串文字调用它,所以参数未定义不会有问题。但是,这再次将函数的结果作为参数传递给filter(),而不是传递函数本身。

filter() 的正确用法是向它传递一个函数(函数引用-不带括号的函数名-或者像您的“示例1”中那样的函数表达式)。因此,请尝试以下操作:

代码语言:javascript
复制
select filter(heap.objects("java.util.HashMap"), isTrue);

function isTrue(object) {  
  return true;  
}

// OR your example 1
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8460213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档