我正在尝试在 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);
}
但是,使用 typeof
检查无参数方法似乎已经调用了该方法。也就是说,如果 MyMethod
接受任何正数的参数,上面的代码将完美运行;但是,如果 MyMethod
是无参数方法,则表达式 typeof(window.external.MyMethod)
不会检查其类型,但也会调用它。
是否有任何解决此行为的方法?我能否以某种方式转义表达式 window.external.MyMethod
以防止发生方法调用?
最佳答案
我没有调试你的具体情况,但我相信我的精神力量可以解决这里发生的事情。
JScript 语言对函数的使用 和仅提及 进行了区分。当你说
x = f;
表示“将对由 f 标识的函数的引用分配给变量 x”。它提到 f。相比之下,
x = f();
使用 f。意思是“调用f标识的函数,并将返回值赋给x。”
简而言之,JScript 中的函数本质上就是我们认为的 C# 中的委托(delegate)类型属性。
有些语言没有这种区别。在 VBScript 中,如果你说 x = f
并且 f 是一个函数,这意味着调用该函数,与 x = f()
相同。 VBScript 不会在语法上对函数的使用和提及进行严格区分。
这一切的实现方式是我们使用 COM;具体来说,我们使用 OLE 自动化。当分派(dispatch)对象的字段以获取其值时,JScript 引擎会传递表示“属性获取”或“方法调用”的标志,具体取决于它是被使用还是被提及。
但是假设您编写的被分派(dispatch)的对象是预期它会被 VB 调用。也许它是用 VB 编写的。 VB 对象说“哦,我看到你问我这个方法的值(value)是完全合理和合法的。因为我不明白提及方法和使用它之间的区别,我将只调用不管你通过哪个旗帜”。
我不知道是否有解决方法,但我愿意赌一美元,正在发生的事情被调用的对象假设调用者需要 VB 语义。
关于c# - window.external 上的无参数方法在使用 typeof 检查时被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2797913/