2017-10-10 3 views
-1

J'ai ce genre de scénario que je dois injecter dansInjecter code javascript dans la portée de fonction anonyme

! function(e) { 
    function doSomething() 
    { 
    } 
} 

Fondamentalement, je reçois une référence à doSomething, lorsque mon code est appelé via l'objet de fonction, mais j'ai besoin pour accrocher à faire quelque chose, donc j'ai besoin d'une référence originale à l'ID. Puisque doSomething est déclaré à l'intérieur d'une fonction anonyme, je ne peux pas y accéder. La question est, puis-je en quelque sorte injecter du code dans la portée de la fonction anonyme, Greesemonkey ou tout autre outil.

+0

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

+0

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

+0

Votre meilleur pari sera d'intercepter le chargement du script, de changer sa source, et d'évaluer cela. – Bergi

Répondre

0

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 
+0

Eh bien, je dois accrocher à la fonction à l'intérieur de cette portée, ce qui signifie que j'ai encore besoin de modifier la référence originale de cette fonction, car il est appelé par plusieurs autres fonctions à l'intérieur de cette portée. Si je l'annule avec une fonction globale, je n'atteindrai que toutes les fonctions appelant maintenant la mienne, mais je dois quand même faire un appel à la fonction d'origine à laquelle je dois m'accrocher. – user1617735

+0

Qu'en est-il des autres méthodes que j'ai énumérées? Il suffit d'inclure 'doSomething' dans la valeur de retour? –

+0

Je n'ai pas accès à la portée interne, c'est tout le problème. – user1617735