8
votes

Comment exécuter "eval" sans écrire "eval" en JavaScript

Voici l'affaire, Nous avons une Big JS Bibliothèque que nous voulons compresser, mais yui compresseur n'est pas complètement Compressez le code s'il trouve une déclaration «eval», par peur qu'elle brisera autre chose. C'est génial et tout, mais nous savons exactement ce qui devient EVAL'D, donc nous ne voulons donc pas qu'il soit conservateur car il y a une déclaration d'évaluation dans MSON.Decode

SO TELIALEMENT LA QUESTION EST: Peut-être créatif) une manière d'écrire une expression qui renvoie la fonction EVAL? J'ai essayé quelques-uns, mais pas de dés: xxx

aucune idée? Thx


1 commentaires

Vous êtes vissé parce que eval n'est pas considéré comme une fonction ordinaire. Vous risquez de déjouer le compresseur YUI, mais vous rencontrerez des navigateurs qui ne vous laissez pas appeler eval par n'importe quel autre nom.


7 Réponses :


0
votes
var e = "e";
window[e+"val"](stuff);

2 commentaires

Cela ne fonctionne pas, les choses courent dans la portée mondiale. Ne semble pas non plus être portable, des problèmes WebKit


fenêtre.eval === fenêtre ['eval'] === fenêtre ['E' + 'Val'] Donc, pas de dés .. Stuff Gets Evaliter dans la lunette de la fenêtre qui n'est pas ce que nous avons besoin



0
votes

Si possible, vous voudrez peut-être essayer l'une des autres bibliothèques de compression depuis que YUI n'est plus le seul jeu en ville.

Voici quelques articles sur les autres outils de compression disponibles.


3 commentaires

Merci pour les suggestions. J'ai joué avec la fermeture de Google, mais il est trop agressif pour nous, renomme trop de choses et casse le code. Nécessiterait un certain temps pour adapter le code juste pour que cela fonctionne et introduirait probablement de nouveaux bugs. Et ce serait bien de vérifier les trucs MS, mais nous sommes une boutique Java / OSX


L'astuce avec la fermeture de Google est de simplement utiliser la compression simple et si cela échoue, utilisez simplement l'espace blanche. C'est une alternative sûre et élimine simplement toutes les espaces blanchisseuses, ce qui vaut mieux que rien.


Cela fonctionne aussi avec YUI aussi, il miniie et tout cela, mais il ne remplace pas de longs noms de variables avec des plus courtes à cause des devales



1
votes

pourrait refroidir les appels Evalir sur une fonction de cale externe qui ne fait pas partie du fichier compressé?


0 commentaires

3
votes

Je ne sais pas si je vous ai compris, mais vous pouvez appliquer une fonction à une portée locale (this) spécifique: xxx

Cette alerte 10 AS F est appliquée avec A.Ce


0 commentaires

1
votes

Est-ce que je manque quelque chose? XXX PRE>

Vérifiez-le http: // www.jsfiddle.net/ngl79/ avec les cadres sous forme de scopes d'évaluation différents. P>

et spécifique à MOTOOLS: P>

var noteval = window["ev"+"al"].create({
    bind: this
}); 


1 commentaires

Merci pour les idées, du moins maintenant, je comprends pourquoi cela ne fonctionnait pas. Jetez un coup d'œil à ma propre réponse



3
votes

Merci pour toutes les idées, j'ai fini par faire un remplacement de texte dans le script de construction qui génère le JS, remplaçant essentiellement $ EVAL $ avec EVAL, après que tout ait été comprimé. J'espérais une manière purement JS, mais avec tant de mises en œuvre différentes de navigateur d'évaluation, il est probablement préférable de laisser simplement être évalué seul

mais basé sur la réponse de Dimitar et certains tripes, voici ce que j'ai trouvé. On dirait que la raison pour laquelle cela ['eval'] ne fonctionnait pas, c'est parce que l'endroit où il se passe, dans motools json.decode, est également une intérieure de hachage: p> xxx pré>

Toutefois, si je stocke la portée locale "Top Niveau" (tout le code, y compris mooTools, fonctionne à l'intérieur d'une fonction anonyme), alors cela fonctionne: P>

var TOP = this;
var JSON = new Hash({
  // snip snip
  decode: function(string, secure) {
    if ($type(string) != 'string' || !string.length) return null;
    if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;

    return TOP.eval('(' + string + ')'); // All good, things run within the desired scope.
  }
});


0 commentaires

-1
votes

De cette façon a besoin de jQuery.

function NotEval(code, callBack) {
    $.ajax({
        url: 'data:application/javascript;charset=utf-8,' + encodeURIComponent(code),
        cache:true,
        success: function (r) {
            if (typeof callBack === "function") {
                callBack()
            }
        },
        error: function (r) {
            console.log("Eval error");
            console.log(r)
        }
    })
}


0 commentaires