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

window(this) に存在するが外部ウィンドウで宣言された関数が関数として認識されず、IE8 によってオブジェクトとして認識される理由を誰かが説明できますか?

ところで、答えを調べる必要があると言う人もいます: typeof window.close は 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

関連記事

余談ですが、すべてのネイティブ型 ( 、 など) で同じ問題が発生するはずFunctionですArray

于 2013-09-19T15:23:07.660 に答える