2017-10-19 15 views
0

J'ai cette fonction func, toujours appelée func.bind(this). Pour func, il est implicitement supposé que le contexte this de la fonction est toujours le contexte this de l'appelant. Cela semble un peu répétitif et appeler func comme ceci peut évidemment conduire à une mauvaise utilisation, car certains utilisateurs pourraient facilement oublier d'appeler func sans le lier à this. Je me demandais s'il existait un moyen concis de toujours utiliser le contexte this de son appelant.Existe-t-il un idiome Javascript où la fonction `func` est appelée` func.bind (this) `

Je pensais à utiliser une méthode d'ordre supérieur qui force l'utilisateur à entrer le contexte de l'appelant. La méthode ressemblerait à ce qui suit:

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

Les deux fonctionnent. Utiliser la nouvelle syntaxe '() => {}' de ES6 pour définir les fonctions liera implicitement 'this' à' this' de l'appelant également. – Shadow

+0

'sera implicitement lier cela à l'appelant'' - cela ne semble pas tout à fait raison –

+0

Je ne pense pas avoir compris votre question/problème. Pouvez-vous donner un exemple concret? * "Je me demandais s'il y avait une façon concise de toujours utiliser le contexte de l'appelant." * Non. L'appelant devrait définir "this" explicitement au moment de l'appel. –

Répondre

0

Vous pouvez créer une fonction qui attend une fonction, un objet pour définir le contexte à this et N arguments en utilisant le paramètre de repos et Reflect.apply() pour régler this à la fonction appel

// 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

Je me demandais s'il y a un moyen concis alway s utilise le contexte this de son appel.

Vous semblez fondamentalement demander une portée dynamique. La façon dont this obtient sa valeur est dynamique, mais il est explicite la plupart du temps. Vous semblez vouloir une fonction qui prend implicitement la valeur this de sa portée d'appel.

Ce n'est pas possible en JavaScript. L'appelant doit définir explicitement la valeur this via f.call(this) ou f.apply(this).