puis-je utiliser y combinateur pour obtenir référence d'objet pour cette fermeture?
-
10-10-2019 - |
Question
cette fermeture fonctionne:
var o = {
foo: 5
};
o.handler = function(obj){
return function() {
alert(obj.foo);
};
}(o);
o.handler(); //alert('5')
est-il possible de définir gestionnaire en ligne, peut-être quelque chose de semblable à une opération y combinateur?
var o = {
foo: 5,
handler: function(obj){
return function() {
alert(obj.foo);
};
}(o); //pointer to o? -----------------------------
};
par curiosité académique, je ne cherche pas à le faire dans le code de production
La solution
Non, cela est impossible, car au moment de la définition du littéral d'objet, la o
variable est non définie, et la référence this
au moment de la définition ne o
de référence.
Si vous avez utilisé une référence temporaire this
dans la fonction extérieure et transmit dans la fermeture, cela fonctionnerait, mais vous ne seriez pas en mesure de passer dans un objet pour obtenir la propriété foo
sur.
var o = {
foo: 5,
handler:function(){
var self = this;
return function() {
alert(self.foo);
};
}
};
var h = o.handler();
h();
Autres conseils
Ceci est impossible avec un objet littéral par lui-même , comme d'autres l'ont souligné. Cependant, le processus peut être enroulé. Ou non wether « ajoute quelque chose » est discutable. Ce n'est pas la même que celle d'un Y-Combinator (peut-être la moitié?), Parce qu'il ne cherche pas à donner un « nom récursive » (pour autant que je peux dire Y Combinators assumer les fonctions de première classe et des fermetures ou un manière à simuler les).
function bindMany (dict, res) {
res = res || {}
for (var k in dict) {
if (dict.hasOwnProperty(k)) {
var v = dict[p]
res[k] = v instanceof Function ? v(res) : v
}
}
return res
}
var o = bindMany({
foo: 5,
handler: function(obj){
return function() {
alert(obj.foo)
}
}
})
Non-testé, mais montre une approche qui pourrait prendre. Il y a des questions subtiles avec cela et une chaîne de prototype sur dict
/ res
, le cas échéant -. Un exercice pour le lecteur
Happy codage.
Vous pouvez simplement utiliser le mot-clé this
ici:
var o = {
foo: 5,
handler: function() {
alert(this.foo);
}
};
C'est beaucoup plus facile approche ... En fait, votre approche est même pas possible, car o
n'est pas défini lorsque vous faites référence.