确定当前Javascript实现是否为Rhino

确定当前Javascript实现是否为Rhino,java,javascript,rhino,javax.script,Java,Javascript,Rhino,Javax.script,我正在Java中使用javax.script,我希望能够检测当前的Javascript实现是否是Rhino。我这样做是因为我需要编写脚本,以便在web页面和Rhino中正常工作 Javascript伪代码: function writeMessage(message) { if (implementation is Rhino) { print(message); } else if (script is running in a web browser)

我正在Java中使用javax.script,我希望能够检测当前的Javascript实现是否是Rhino。我这样做是因为我需要编写脚本,以便在web页面和Rhino中正常工作

Javascript伪代码:

function writeMessage(message) {
    if (implementation is Rhino) {
        print(message);
    }
    else if (script is running in a web browser) {
        document.write(message);
    }
}

如果只是在网络浏览器或Rhino上运行,那么它们肯定是相互排斥的;也就是说,如果脚本没有在浏览器中运行,那么它是通过Rhino运行的。

啊,我们在您的评论中看到了它。只需使用功能检测:

var writeMessage = document && document.write
  ? document.write.bind(document)
  : print;
然后在整个脚本中使用
writeMessage(string)
。这是一个很好的例子

这比您在问题中建议的要好,在问题中,每次调用函数时都会应用检测:

function writeMessage(message) {
    if (document && document.write) { // running in a web browser
        document.write(message);
    } else { // it will be Rhino
        print(message);
    }
}

为什么不用Java代码检查一下呢?我正在尝试编写一个脚本,它既可以在Rhino中工作,也可以在web页面上工作。那么,为什么它不能在这两种语言中工作呢?如果有区别,你可以在上面使用特征检测@Bergi可以用Javascript而不是Java代码检查它吗?我认为用“打印(字符串)”替换每次出现的“document.write(string)”会很麻烦。是的,特征检测就是我在这里要做的。它不是非此即彼。我计划在Rhino以及一些网页中使用该脚本。如果脚本在Chrome中运行,我会使用“console.log”,如果脚本在Rhino中运行,我会使用“write”。替代选项是什么?他的意思是:只有两个选项可以运行,当脚本执行时,它正好在其中一个选项中运行。@Bergi,那么,它们不应该相互排斥吗?如果我错了,请原谅。@veer为什么选项会相互排斥?可以编写一个在Rhino和浏览器中正常运行的脚本(使用功能检测)。我没有看到变量“pring”的声明。这指的是什么?@AndersonGreen这是一个打字错误;他的意思是打印。那么这个代码实际上是做什么的呢?语法对我来说有点不清楚。可以在没有问号运算符的情况下重新编写吗?Javascript中三元运算符语法的解释(在这种情况下很难理解):@AndersonGreen If
document
已定义且不为空,并且
document.write
也已定义,然后将
writeMessage
变量设置为对绑定函数的引用,即
document.write
;否则,它会将
writeMessage
设置为对
print
的引用。基本上,如果您可以使用
document.write
,它就会使用它(例如,这在大多数浏览器中都适用);如果不是,则它假定您正在使用Rhino,并选择打印。
function writeMessage(message) {
    if (document && document.write) { // running in a web browser
        document.write(message);
    } else { // it will be Rhino
        print(message);
    }
}