4

我在理解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()显示警报。

甚至 underscoreJS 也会感到困惑

_.isFunction(this.sayhi)       false

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

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

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

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

1 回答 1

2

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

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

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

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

相关文章

附带说明一下,您应该看到所有本机类型( , 等)都有同样FunctionArray问题

于 2013-09-19T15:23:07.660 回答