2017-10-19 3 views
0

私はこの関数funcを持っています。これは常にfunc.bind(this)として呼び出されます。 funcについては、関数のコンテキストが常に呼び出し側のthisコンテキストであると暗黙的に仮定されています。これは少し繰り返されているようで、funcを呼び出すことなく、funcに電話することを忘れる可能性があるため、このような呼び出しは明らかに誤用につながります。this私は、常にその発信者の文脈を使用する簡潔な方法があるかどうか疑問に思っていました。`func`関数が` func.bind(this) `と呼ばれるJavascriptイディオムがありますか?

私は、ユーザーに呼び出し元のコンテキストを入力させる高次のメソッドを使用することを考えていました。この方法は、次のようになります。

function createFunc(context) { 
    return function func() { 
    // rather than call `this`, you use the input parameter, `context`. 
    } 
} 
+0

両方とも動作します。関数を定義するためにES6の新しい '()=> {}'構文を使うと、暗黙のうちに 'this'を呼び出し元の' this'にバインドします。 – Shadow

+0

'暗黙のうちにこれを呼び出し元のthisにバインドします - それは正しくないと聞きます –

+0

私はあなたの質問/問題を理解しているとは思わない。あなたは具体的な例を挙げることができますか? * "呼び出し元のこのコンテキストを常に使用する簡潔な方法があるかどうか疑問に思っていました。" *いいえ。呼び出し元は呼び出し時に 'this 'を明示的に設定する必要があります。 –

答えて

0

をあなたは、thisにコンテキストを設定することを目的とし機能を期待する関数を作成し、そしてNの関数呼び出し

thisを設定するには、残りのパラメータと Reflect.apply()を使用して引数をすることができます

// default `this` object 
 
const o = { 
 
    n: 10 
 
}; 
 
// `func` : function to pass as first parameter to `fn` 
 
// `THIS` : object to set to `this` within `fn`, if `undefined` use `o` 
 
// `args` : N arguments to `func` 
 
const fn = function fn(func, THIS = o, ...args) { 
 
    return Reflect.apply(func, THIS, args) 
 
} 
 

 
let res = fn(
 
      function func(...params) { 
 
       // do stuff 
 
       return params.map(n => this.n * n * Math.PI) 
 
      } 
 
      , void 0 
 
      , 10, 20, 30, 40, 50 
 
     ); 
 

 
console.log(JSON.stringify(res, null, 2));

2

なかれする簡潔な方法がある場合、私は思っていましたその呼び出し元の文脈を使用してください(this)。

あなたは基本的にダイナミックな範囲を求めているようです。 thisがどのようにその値を取得するかは動的ですが、ほとんどの場合明示的です。呼び出すスコープの値を暗黙的に取得する関数が必要なようです。

JavaScriptではこれができません。呼び出し元はf.call(this)またはf.apply(this)で明示的にthisの値を設定する必要があります。

関連する問題