IE8。为什么typeof在子窗口中表现不同?

时间:2013-09-19 15:17:07

标签: javascript internet-explorer internet-explorer-8 underscore.js

我在IE8中理解 typeof 的机制时遇到了问题。

我在“parent.html”中有以下JavaScript代码:

var myNewWindow = window.open('child.html');
myNewWindow.sayhi = function() {
    alert('Hi!');
}

在parent.html中,我们打开一个JavaScript控制台(F12)。我们测试类型并且看起来正确。

typeof myNewWindow.sayhi      "function"

但是如果我打开一个控制台并在子窗口中进行一些测试,结果就会有些奇怪。

typeof this.sayhi             "object"

事情是可以调用“对象”。 this.sayhi()显示警告。

即使是下划线也会感到困惑

_.isFunction(this.sayhi)       false

有人可以解释为什么在窗口(this)中出现但在外部窗口中声明的函数不被识别为函数而是被IE8识别为对象吗?

顺便说一下,有人说我应该看看答案: typeof window.close is different for IE

猜猜是什么?它仍然说这个东西是一个对象:

Object.prototype.toString.call(this.sayhi)          '[object Object]'

1 个答案:

答案 0 :(得分:2)

这似乎是由于typeof在内部检查被测项目是否继承当前窗口的Function对象。由于该函数是在另一个窗口中创建的,并且是从另一个Function对象继承的,因此检查失败。

为了证明这一点,在子窗口的控制台中输入:

this.sayhi instanceof Function>你应该得到false

this.sayhi instanceof window.opener.Function>你应该得到true

Related article

在旁注中,您应该会看到所有原生类型(FunctionArray等)的同样问题。