dans une fonction, j'aimerais réussir à exécuter une autre fonction en
ajoutant à son scope des variables que j'aurais définies.
je m'explique avec un cas concret.
Prenons le code suivant :
function doSomething() {
log("doSomething");
}
function callDoSomething() {
function log(str) {
var elt = document.getElementById('log');
elt.innerHTML += "<div>" + str + "</div>";
};
doSomething();
}
Le problème ici, c'est que dans "doSomething", la fonction "log"
n'existe pas. Elle n'est pas dans son scope. J'aimerais un moyen pour
l'injecter.
Le plus proche de ce que je veux que j'arrive à faire, ce serait ça :
function doSomething(ctxt) {
ctxt.log("doSomething");
}
function callDoSomething() {
function log(str) {
var elt = document.getElementById('log');
elt.innerHTML += "<div>" + str + "</div>";
};
doSomething({log: log});
}
Eventuellement, on peut rajouter un bloc "with(ctxt)" au début de
doSomething. Mais j'aimerais justement en quelque sorte qu'il soit
implicite.
Pour contextualiser, mon but final, c'est un code un peu plus
compliqué pour faire un système de plugins. Pour des raisons de
paranoïa aigüe (et peut-être parce que je suis infecté par Java), je
ne veux pas que ces fonctions "injectées" soient publiques.
Avez-vous une meilleure idée que ce que j'ai là ?
--
Julien
--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes Professionnels francophones du développement web.
Pour envoyer un message à ce groupe, adressez un e-mail à webd...@googlegroups.com.
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse webdevfr+u...@googlegroups.com.
Pour plus d'options, consultez la page de ce groupe : http://groups.google.com/group/webdevfr?hl=fr
2010/9/7 samuel <zoul...@gmail.com>:
ça ne fonctionne pas car doSomething n'aurait toujours pas accès aux
méthodes privées.
--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes Professionnels francophones du développement web.
Pour envoyer un message à ce groupe, adressez un e-mail à webd...@googlegroups.com.
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse webdevfr+u...@googlegroups.com.
Pour plus d'options, consultez la page de ce groupe : http://groups.google.com/group/webdevfr?hl=fr
non, ça ça marchera pas.
Il faut que tu fasses calldoSomething.log.
> callDoSomething = {
> log : function(str) {
> alert(str);
> },
> init : doSomething
> }
>
> callDoSomething.init();
>
> D'ailleurs tu peux carrément toujours coder de cette façon, avec des objets
> javascripts simples que tu peux appeler facilement grâce aux espaces de noms
> (CallDoSomething.xx).
Ouaip, j'ai volontairement simplifié ici le code :-)
C'est pour ça que je vous ai aussi parlé des plugins : j'ai déjà une
classe, et je veux qu'elle puisse exécuter des fonctions extérieures
tout en leur donnant des méthodes privées.
Honnêtement, je pense pas qu'il y ait de solution. Il faudrait ajouter
une nouvelle "scope chain" (cf
http://www.jibbering.com/faq/notes/closures/#clScCh) à notre appel de
la fonction, mais je ne crois pas ce que soit possible.
--
Julien
Ça rejoint mon passage de contexte en argument.
(et si on utilise apply ou call, on l'aurait avec this)
Le passage en argument ou par apply permet de mieux encapsuler la
chose, mais c'est similaire.
>
> Dans tout les cas le contenu de la méthode log sera visible si le
> développeur du plugin fait une méthode du type :
> function doSomething() {
> alert(log);
> }
Ah ben oui.
Je veux juste éviter que n'importe quel autre bout de code puisse y
accéder par souci de propreté et d'élégance de code.
> Logiquement il n'y a pas de voies pour partager des méthodes privées, et
> qu'elles restent privées : à partir du moment ou tu arrives à les partager
> elles ne sont plus privées
certes, c'est du bon sens :-)
--
Julien
Tu as regard� du c�t� des plugins jQuery ?
http://www.jquery.info/spip.php?article24
--
Olivier G.
http://twitter.com/lespacedunmatin
http://www.lespacedunmatin.info/
oui oui,
dans les plugins jQuery, tout est public, c'est facile :-)
Julien
this.plug.doSomething.apply(this).
Mais plus simplement, dans ton exemple, on pourrait directement
utiliser core.log :)
Bref, je vais rester avec ma variable contexte bien explicite ;)
2010/9/7 samuel <zoul...@gmail.com>: