1

filereader イベント中に発生するコールバックとして渡されるメソッド内からオブジェクトのメンバー変数にアクセスしようとしています。

私の要点を伝えるために、以下のコードをまとめました。「this」は、呼び出し時にオブジェクトではなくファイルリーダーになるようです。オブジェクト変数にアクセスできるようにする方法はありますか?

コールバックがオブジェクトに合わせて調整されていることを確認したいと思います。それ以外の場合は、それらをクラス外の静的関数として定義するだけです。

function myClass(newName)
{
    this.name = newName;
    this.m_fileReader = new FileReader();

    this.finishedLoading = 
        function(param1)
        {
            alert(this.name);
        };

    this.m_fileReader.addEventListener('loadend',  
                                       this.callback_finishedLoading, 
                                       false);
}

var instance = new myClass('timmy');
var instance2 = new myClass('joe');
4

3 に答える 3

4

関数が必要です.bind

this.m_fileReader.addEventListener('loadend',
    this.callback_finishedLoading.bind(this),
    false);

関数は渡されたパラメーターを受け取り、ブラウザーが提供しようとした値の代わりに、.bindそのパラメーターを使用して元の関数を呼び出します。this

または、独自のエイリアスを作成thisして、匿名関数で呼び出しをラップします。

var self = this;
this.m_fileReader.addEventListener('loadend', function(ev) { 
    self.callback_finishedLoading(ev)
}, false);

後者は.bindに舞台裏で行われますが、シムなしで ES5 より前のブラウザーで動作するという利点があります。

于 2013-07-11T20:05:12.603 に答える
1

次のように、コンストラクターにEventListenerインターフェイスを実装させることができます。

function myClass(newName) {
    this.name = newName;
    this.m_fileReader = new FileReader();
    this.m_fileReader.addEventListener('loadend', this, false);
}

myClass.prototype.handleEvent = function(event) {
    return this[event.type] && this[event.type](event)
}

myClass.prototype.loadend = function(event) {
    alert(this.name);
};

var instance = new myClass('timmy');
var instance2 = new myClass('joe');

の名前を に変更しfinishedLoading、コンストラクターの にloadend配置しました。.prototype次に、に.handleEventメソッドを追加しました.prototype

最後に、コンストラクターでは、関数をまったく渡しません。代わりにthismyClassインスタンスである を渡すだけです。

param1使い方が不明だったので削除しました。他の呼び出しから何らかの値を受け取る必要がある場合は、 で別のfinishedLoadingメソッドを作成し、.prototypeそのメソッドにそれを呼び出させることができます.loadend()

于 2013-07-11T20:12:04.440 に答える
0

thisコンテキストに関連しています。新しいブロック {} を開くたびに、現在のブロック コンテキストに変更されます。thisコールバック関数を呼び出す前に、別の変数に保存してください。

于 2013-07-11T20:06:47.467 に答える