Javascript 函数怎么可能未定义但仍可调用?

How is it possible for a Javascript function to be undefined and still invokeable?

写的时候

window.external.AddSearchProvider

在 Internet Explorer 11 中我得到 "undefined",但我仍然可以调用和使用该函数。而在 Chrome 中,方法已定义且可用。

如果我写

"AddSearchProvider" in window.external

我在 Internet Explorer 和 Chrome 中都得到 "true"。

这是预期的行为吗?我的印象是我可以通过检查函数是否已定义来检查我是否可以使用该函数,还是我误解了它?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in

The in operator returns true if the specified property is in the specified object.

Addsearchproviderwindow.external中的一个变量。 in 检查 window.external 中是否有同名的变量。 AddSearchProvider 的值无关紧要

window.external.AddSearchProvider() 是一个触发器。它会触发分配的所有 window.external.AddSearchProvider 事件。

window.external.AddSearchProvider() 和window.external.AddSearchProvider 是完全不同的。

window.external.AddSearchProvider 不是 "plain" javascript 函数。它是浏览器提供的本机功能,每个浏览器的处理方式不同。

当您在浏览器 javascript 控制台中键入 window.external.AddSearchProvider 时,您会在浏览器的 javascript 中看到此值的表示形式。大多数浏览器都实现了其本机功能的表示,但 Internet Explorer 似乎没有,因此您会看到 undefined,因为控制台没有可显示的值。但是这个函数是可以调用的。

举个例子,你可以把它看成一个对象,有这样的方法

toJavascriptValue : function() {
    return undefined;
}