c# - window.external 上的无参数方法在使用 typeof 检查时被调用

标签 c# javascript 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);
}

但是,使用 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/

相关文章:

C# 在方法参数内等待

JavaScript : How to get the window width and height?

javascript - 拖放不适用于缩放

javascript - 如何使用 Elementor 和 Swiper.js 在帖子 slider 上定位自定义帖子类型

html - 滚动条MB问题

c# - 将具有空值的参数添加到 sqldatasource 控件的更好方法

c# - 从异步方法调用同步方法

c# - 将枚举转换为字符串的最佳实践方法是什么?

javascript - 我需要 Javascript 闭包吗?

internet-explorer - Socket.io:为什么 htmlfile 优于 XHR-Polling?