0

コード(モジュールパターン)でJSオブジェクトを作成します。

var Validator = {
    regexEmail: /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/,

    settings: {
        error_class: "error-field",
        formValid: true
    },

    init: function (form, default_error_class) {
        self = this;
        alert(self == window);
    },
};

chromeで「init」関数を実行すると、self == window(予期される)に対してfalseが発生します。しかし、IE9で試してみると、true(!)になります。私に理由を教えてくれる?'this'は、ウィンドウではなく、カスタムValidatorオブジェクトをキャプチャすることを期待します

4

4 に答える 4

2

'self'を定義するときにスコープを修正します。また、明示的ではなく暗黙的なコンパレータを使用します。つまり、===not==です。

var Validator = {
    regexEmail: /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/,

    settings: {
        error_class: "error-field",
        formValid: true
    },

    init: function (form, default_error_class) {
        var self = this;
        alert(self === window);
    },
};

Validator.init();
于 2013-03-24T09:25:40.820 に答える
1

すぐに実行される匿名コンストラクター関数を使用できます

var Validator = new function(){
    this.regexEmail = 
        /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
    this.settings = {
        error_class: "error-field",
        formValid: true
    };
    this.init = function (form, default_error_class) {
        console.log(this === window);
    };
    return this;
}();
Validator.init(); //=> false
于 2013-03-24T09:27:17.957 に答える
0

alert(self === window);等式演算子の代わりに使用 します。また、2つの演算子の詳細については、ここで受け入れられた回答を確認できます。JavaScriptの比較では、どちらの演算子(== vs ===)を使用する必要がありますか?

もう1つ:Geniusが言ったように、スコープを修正します。

var self=this; 
于 2013-03-24T09:28:27.170 に答える
0

この場合、IEは実際には正しいと思います。

var定義時に使用しなかったためself、暗黙のグローバルです。このグローバルを設定しようとするselfと失敗します。これは、ブラウザにwindowすでにあるグローバルオブジェクトに、window.selfへの参照であるプロパティがあるためwindowです。

HTMLの生活水準は言う

window、frames、およびself IDL属性すべて、WindowオブジェクトのブラウジングコンテキストのWindowProxyオブジェクトを返す必要があります。

window.selfこれは、それが不変であることを意味します。

だから、window.self == windowそしてそれは真実を警告します。

ただし、一部の古いサイトとの互換性を維持するための歴史的なハッキングのため、WebKitとGeckoにはバグ/機能があり、実際には上書きできないはずですが、上書きすることができます。(少なくともGeckoでは)分割されたオブジェクトに関係しているようです。

于 2013-03-24T11:21:18.250 に答える