IE8.为什么类型在子窗口中的行为不同

IE8. Why typeof behaves different in child windows?

本文关键字:窗口 为什么 类型 IE8      更新时间:2023-09-26

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

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

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

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

typeof myNewWindow.sayhi      "function"

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

typeof this.sayhi             "object"

问题是可以调用"对象"。this.sayhi() 显示警报。

甚至下划线JS也会感到困惑

_.isFunction(this.sayhi)       false

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

顺便说一句,有人说我应该看看答案:类型of window.close对于IE是不同的

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

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

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

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

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

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

相关文章

附带说明一下,您应该在所有本机类型(FunctionArray等)中看到相同的问题。