3

通常、関数を (オブジェクトのメソッドとしてではなく) 関数として呼び出す場合、this変数はグローバル オブジェクト (ブラウザーのウィンドウ オブジェクト) を指します。IE8 では、この変数がウィンドウ オブジェクトと同一 (===) でも等しくない (==) という状況が見つかりました: http://jsfiddle.net/zgJGU/1/

コードを見ると、さらに奇妙な動作に気付くかもしれません:関数から返されると、グローバルな値が変化します (関数内では window と等しくなく、関数外では、と等しくなります)。窓)

(なぜこれが重要な問題なのかと尋ねるかもしれません。なぜなら、関数が関数として呼び出されたのか、オブジェクトのメソッドとして呼び出されたのかを確認したいからです。)

この奇妙な振る舞いについて説明できますか?(または、関数がメソッドとして呼び出されたか、関数として呼び出されたかを確認する正しい方法)

4

1 に答える 1

1

それは確かにあなたが発見した非常に奇妙な問題です。グローバルスコープで暗黙的に新しい関数を作成した場合、結果はおそらく期待どおりです。jsFiddleを変更し、その一部を以下に示します... http://jsfiddle.net/VYcmT/

var ff = function() {
    var global = this;
    console.log(global === window);        // true       
    console.log(global == window);         // true
    return global;
};
var global = ff();
console.log(global === window);            // true
console.log(global == window);             // true

奇妙な部分は、次のスニペットのように、グローバルスコープ()から明示的に関数を定義するとwindow、IE8が混乱し始めることです... http://jsfiddle.net/zsWUK/

に関数を明示的に割り当ててwindowからそれを呼び出すと、IE8thisは何らかの形で特別なものになっているようです。windowのプロパティを比較するとthis、肯定的な比較になります。thisIE8がオブジェクトのある種のラッパーとして扱われるように見えwindowます。

window.ff = function() {
    var global = this;
    console.log(global === window);        // false       
    console.log(global == window);         // false
    console.log(global.window === window); // true
    console.log(global.window == window);  // true
    return global;
};
var global = ff();
console.log(global === window);            // false
console.log(global == window);             // true
console.log(global === window.window);     // true
console.log(global == window.window);      // true

良いニュースは、上記と以下の両方のコードスニペットがすべてtrueChrome、Firefox、IE9/10などで返されることです...

于 2013-01-03T18:12:42.233 に答える