【问题标题】:IE8. Why typeof behaves different in child windows?IE8。为什么 typeof 在子窗口中的行为不同?
【发布时间】:2013-09-19 15:17:07
【问题描述】:

我在理解 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

谁能解释一下为什么一个存在于 window(this) 中但在外部窗口中声明的函数不被 IE8 识别为函数,而是被 IE8 识别为对象?

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

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

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

Related article

顺便说一句,您应该会在所有原生类型(FunctionArray 等)上看到同样的问题

【讨论】:

  • 所以...如果我错了,请纠正我。 typeof 实际上调用了 instanceof 然后给你一个输出,对吧?
  • 有点。它们都依赖于相同的内部属性。 ecma-international.org/ecma-262/5.1/#sec-11.4.3
  • @AdrianSalazar:不,它没有。这个答案似乎让他们感到困惑 - 它所说的 instanceof 是真的,但与您的 typeof 问题无关。
  • HasInstance 是他们都依赖的内部函数。它检查原型链是否匹配对象。就像我说的,由于函数不是在子窗口的原型链中创建的,所以检查失败。
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 2021-12-06
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多