0

私は一つのことを理解していません:

 var comein = document.getElementById("comein");

 var enter = new Expand({ elem : comein });

function Expand (options) {
    this._elem = options.elem;
    console.log(this._elem); // i have a div element    
}

Expand.prototype = {        
    check : function () {

        var comInClassName = this._elem.className; // i have an error: this._elem is undefined

        if (comInClassName == "open"){
          this.close();
        }
        if (comInClassName == "close"){
          this.open();
        }
    }
}
log_in.addEventListener("click",  enter.check, false);

Expand に通常の要素がある場合、prototype メソッドでエラーが発生するのはなぜですか? ありがとう

4

1 に答える 1

6

の呼び出し 方法に完全に依存しますcheck。次のように呼び出す場合:

enter.check();

....その後、呼び出し内でオブジェクトthisを参照しenter、プロパティを持ち_elemます。一方、次のように呼び出されるように設定した場合:

enter._elem.addEventListener('click', enter.check, false);

...その後、呼び出し内 (イベントが発生したとき) はthisではなく を参照するため、プロパティはありません。enterthis._elem_elem

これは、JavaScript では (今のところ)、this関数呼び出し内で、関数が定義されている場所ではなく、関数が呼び出される方法によって完全に定義されているために発生します。オブジェクトから関数参照を取得する式の一部として呼び出す場合:

enter.check();

...次にthis、関数参照を取得したオブジェクトを参照します。しかし、上記の呼び出しのように個別に呼び出すとaddEventListener、そうではありません。

ECMAScript5 対応の環境を使用している場合 (または適切な ES5 shim を配置している場合)、以下を使用して修正できますFunction#bind

enter._elem.addEventListener('click', enter.check.bind(enter), false);

bindthis呼び出されると、方向転換し、指定された値 (この場合は )を使用して基になる関数を呼び出す関数を返しますenter

探索する詳細 (私のブログで):

于 2013-02-11T16:32:05.850 に答える