我在理解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
相关文章
附带说明一下,您应该在所有本机类型(Function
、Array
等)中看到相同的问题。