使用typeof检查时,会调用window.external上的无参数方法

jan*_*nko 13 javascript c# internet-explorer webbrowser-control

我试图在System.Windows.Forms.WebBrowser控件中显示带有嵌入式JavaScript代码的HTML页面.期望JavaScript代码通过window.external对象与嵌入环境交互.在调用方法之前window.external,JavaScript应该检查方法是否存在.如果不存在,代码应该调用通用的回退方法.

// basic idea
if (typeof(window.external.MyMethod) != 'undefined') {
    window.external.MyMethod(args);
} else {
    window.external.Generic("MyMethod", args);
}
Run Code Online (Sandbox Code Playgroud)

但是,检查无参数方法typeof似乎已经调用了该方法.也就是说,如果MyMethod接受任何正数的参数,上面的代码将完美地工作; 但是,如果MyMethod是无参数方法,则表达式typeof(window.external.MyMethod)不会检查其类型,而是调用它.

这种行为有没有解决方法?我可以以某种方式逃避表达式,window.external.MyMethod以防止方法调用发生?

Eri*_*ert 9

我没有调试你的确切情况,但我相信我的精神力量可以解决这里发生的事情.

JScript语言区分了函数的使用和仅提及它.当你说

x = f;
Run Code Online (Sandbox Code Playgroud)

这表示"将由f标识的函数的引用赋给变量x".它提到了 f.相比之下,

x = f();
Run Code Online (Sandbox Code Playgroud)

使用 f.它表示"调用f标识的函数并将返回的值赋给x".

简而言之,JScript中的函数基本上是我们所认为的C#中委托类型的属性.

有些语言没有这种区别.在VBScript中,如果你说x = f和f是一个函数,那就意味着调用函数,就像x = f().VBScript在函数的使用和提及之间没有语法上的强烈区别.

实现这一切的方式是我们使用COM; 具体来说,我们使用OLE自动化.当调度对象的字段以获取其值时,JScript引擎会传递表示"property get"或"method invoke"的标志,具体取决于它是使用还是提及.

但是假设您调度的对象是在期望它将从VB调用的情况下编写的.也许它是用VB编写.VB对象说"哦,我看到你问我这个方法的价值是完全合理合法的.因为我不明白提到一个方法和使用它之间的区别,我只是调用无论你通过哪个国旗".

我不知道是否有一个解决方法,但我愿意下注多达一美元,发生的事情是被调用的对象假设调用者想要VB语义.


小智 6

我找到了这个

if ('MyMethod' in window.external)
Run Code Online (Sandbox Code Playgroud)

不会调用MyMethod