【问题标题】:Why is usage of javascript within visualvm (jhat?) oql sometimes confusing?为什么在 visualvm (jhat?) oql 中使用 javascript 有时会令人困惑?
【发布时间】:2012-01-17 14:44:54
【问题描述】:

我很想知道为什么 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”没有被引用):

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

示例 2(注意“it”被引用):

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 中特殊处理?):

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

function isTrue(object) {  
  return true;  
}

我问这个是因为它看起来不直观,并且当我尝试创建可用的东西时,非直观行为的变化会出乎意料地出现并减慢我的速度。

【问题讨论】:

    标签: javascript visualvm oql jhat


    【解决方案1】:

    您的不同语法等效。第一个:

    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(array, childOfMyClass("it","re​​ferrers(it)")) 是 childOfMyClass 传递两个参数的示例,我现在可以看到是显然错了。我将其更改为采用一个参数,然后在没有参数列表的情况下传递过滤器 childOfMyClass。
    猜你喜欢
    • 2014-05-24
    • 1970-01-01
    • 2013-02-11
    • 2018-09-02
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    相关资源
    最近更新 更多