2

JavaScriptと、関数を別の関数のパラメーターとして渡すことに問題があります。

私たちがクラスの中にいて、そのようなことをしているとしましょう:

this.get('target').update(this.onSuccess, this.onFail);
  • 'target'は、update()というメソッドを持つJavaScriptオブジェクトです。
  • このメソッドを呼び出して、呼び出し元クラスの2つのメソッドをパラメーターとして渡します

そのupdate-method内でいくつかのことが起こり、それが完了すると、そのメソッドはonSuccess-methodまたはonFail-methodのいずれかを呼び出す必要があります。これは次のようになります。

update: function(onSuccess, onFail) {
  if(true) {
    onSuccess();
  } else {
    onFail();
  }
}

今まで、すべてがかなりうまく機能します!しかし、caller-class(上記のupdate-methodを呼び出すもの)で定義されているsuccess / fail-methods内では、this-pointerを使用しています。

onFail: function() {
  alert('Error: ' + this.get('target').error);  
}

このポインタがいくつかの問題を引き起こすこと。メソッドが最初に定義されたクラスではなく、「ターゲット」オブジェクトを指します。

私が今やらなければならないことは、メソッドを再び機能させるために、'target'クラス内のonSuccess/onFail呼び出しの直前にthis-pointerを更新することです。しかし、これは「左側の無効な割り当て」エラーのために機能しません。

そのようなシナリオのベストプラクティスは何ですか?何か案は?事前にt​​hx!!!

乾杯

4

3 に答える 3

4

呼び出すときは2つのオプションがありますupdate()

  • javascript関数call()
  • javascript関数apply()

主な違いは、パラメータを渡す方法です。ただし、どちらもスコープ/コンテキストインジェクションを許可します。

コードは次のようになります。

this.get('target').update.call(this, this.onSuccess, this.onFail);
于 2010-10-06T13:45:52.830 に答える
3

関数を特定のオブジェクトに「バインド」する関数を作成し(クロージャを使用)、これらのバインドされた関数をハンドラーに渡すことができます。

function bind(obj, fun) {
   return function() {
      return fun.apply(obj, arguments);
   };
};

update(bind(this, this.onSuccess), bind(this, this.onFail));
于 2010-10-06T13:53:58.207 に答える
1

これをリダイレクトするには、ほとんどすべてのJavaScriptライブラリにあるようbind()に、クラスに(または同様の)メソッドが必要です。Function

if(!Function.prototype.bind){
    Function.prototype.bind = function(scope) {
      var _function = this;

      return function() {
        return _function.apply(scope, arguments);
      }
    }
}

次に、次のようなことを行います。

update: function(onSuccess, onFail) {
  if(true) {
    onSuccess.bind(this)();
  } else {
    onFail.bind(this)();
  }
}

メカニズムはここで説明されています:JavaScriptでのバインディングスコープ

于 2010-10-06T13:52:00.930 に答える