例えば、クラスA が クラスB へ非同期処理をお願いして、終わったら渡しておいたコールバックを呼び出してもらうとします。
/** * クラスA * @class * @property {B} b クラスBのインスタンス */ var A = function() { this.myname = 'A'; this.b = new B(); }; /** * クラスAの処理 * B にコールバックを渡す * 非同期な処理が終わったらコールバックを呼び出してもらう * @method */ A.prototype.start = function() { this.b.start(this.callback); }; /** * コールバック関数 * @method */ A.prototype.callback = function() { alert('私の名前は ' + this.myname + ' です'); }; /** * クラスB * @class */ var B = function() { } /** * 非同期処理を行う * 終わったらコールバックを呼び出す * @method * @param {Function} callback コールバック関数 */ B.prototype.start = function(callback) { setTimeout(function() { callback(); }); }; // 実行 var a = new A(); a.start(); // "私の名前は undefined です"this が a を指すと思いきや window を指します。
window.myname は未定義なので unndefined が出力されます。
こういう時は callback と一緒に自分自身を渡して、callback 呼び出し時に this として自分自身を指定してもらえば大丈夫です。
this を指定して関数を呼ぶときは call() を使います。
/** * クラスA * @class * @property {B} b クラスBのインスタンス */ var A = function() { this.myname = 'A'; this.b = new B(); }; /** * クラスAの処理 * B にコールバックを渡す * 非同期な処理が終わったらコールバックを呼び出してもらう * @method */ A.prototype.start = function() { this.b.start(this, this.callback); }; /** * コールバック関数 * @method */ A.prototype.callback = function() { alert('私の名前は ' + this.myname + ' です'); }; /** * クラスB * @class */ var B = function() { } /** * 非同期処理を行う * 終わったらコールバックを呼び出す * @method * @param {A} caller 呼び出し元のインスタンス * @param {Function} callback コールバック関数 */ B.prototype.start = function(caller, callback) { setTimeout(function() { callback.call(caller); // this = caller として callback() を実行 }); }; // 実行 var a = new A(); a.start(); // "私の名前は A です"
0 件のコメント:
コメントを投稿