Javascript ne facilite pas l'obtention de valeurs à l'intérieur d'une étendue.
Vous pouvez déclarer doSomething
dans un cadre plus large:
function doSomething() {
// ...
}
function func(e) {
doSomething(); // This works! `func` has a reference to `doSomething`
}
doSomething(); // This also works! `doSomething` is declared in this scope.
Vous pouvez également renvoyer des valeurs d'une portée intérieure! Par exemple:
function func(e) {
function doSomething() {
// ...
}
// Note that we are not invoking `doSomething`, we are only returning a reference to it.
return doSomething;
}
var doSomething = func(/* some value */);
// Now you got the reference!
doSomething();
Parfois, votre fonction extérieure est déjà nécessaire pour retourner une autre valeur:
function func(e) {
function doSomething() { /* ... */ }
return 'important value!!';
}
Dans ce cas, nous pouvons encore revenir doSomething
, ainsi que la valeur d'origine:
function func(e) {
function doSomething() { /* ... */ }
return {
value: 'important value',
doSomething: doSomething
};
}
var funcResult = func(/* some value */);
var originalValue = funcResult.value;
var doSomething = funcResult.doSomething;
// Now we have the original value, AND we have access to `doSomething`:
doSomething(); // This works
Que voulez-vous dire par "injecter"? Essayez-vous de créer une extension userscript/browser qui manipule JS sur une certaine page? Oui, vous pouvez faire tout ce que vous voulez avec ça, mais vous ne pouvez pas changer 'doSomething' seulement avec une référence. – Bergi
Oui, j'écris un script d'utilisateur et je veux accrocher à certaines des fonctions sur la page Web. Pour cela, j'ai besoin de modifier la référence d'origine à une fonction qui se trouve dans la portée de la fonction anonyme. – user1617735
Votre meilleur pari sera d'intercepter le chargement du script, de changer sa source, et d'évaluer cela. – Bergi