2010-10-27 10 views
8

Dans Google Closure Compiler je reçois l'avertissementAVERTISSEMENT - utilisation dangereuse du monde cet objet

AVERTISSEMENT - utilisation dangereuse du monde cet objet

Voici un exemple. La ligne d'erreur et le décalage fait référence au début du mot this

function aToggle() { 
    if(shown) 
    toggle.show() 
    else 
    toggle.hide() 
    $(this).text(shown ? 'Click to hide' : 'Click to show') 
    shown = !shown 
} 
link.onclick = aToggle 

Je voudrais juste changer une méthode anonyme, mais je suis réutilisant aToggle ailleurs dans le fichier, il doit être nommé. Je pourrais marquer aToggle comme /**@constructor*/ - mais ce n'est pas un constructeur. Y a-t-il une autre annotation que je peux utiliser pour éliminer cet avertissement, ou suis-je coincé entre le marquage en tant que constructeur ou l'affichage d'un tas d'avertissements inutiles?

+0

Ok, c'est facile à faire. De toute façon: 'shown' et' toggle' sont globaux? Je n'ai pas utilisé Google Closure Compiler, mais il ne sait probablement pas que votre aToggle est un gestionnaire d'événements. Voyez s'il y a un endroit où vous pouvez le dire, parce que «ceci» n'est pas nécessaire, le «ceci» global. – some

+0

Oui, j'utilise unToggle dans d'autres endroits. Le code ci-dessus est juste un exemple que j'ai écrit. –

Répondre

13

Modifier: J'ai lu Fermeture: The Definitive Guide, et je viens de réaliser que vous pouvez simplement ajouter le /** @this {Element} */ annotation avant que votre gestionnaire d'événements pour faire se plaindre contre la fermeture du compilateur. Voir la Closure Compiler warning reference Le compilateur de fermeture affiche cet avertissement lorsque vous utilisez this dans une fonction qui n'est pas annotée /** @constructor */ ou dans la classe prototype d'une classe. Le compilateur suppose que vous n'utiliserez jamais this lorsqu'une fonction est appelée dans le contexte d'un autre objet (ce que font les callbacks d'événement).

Certains endroits que vous pourriez avoir à changer pour faire se plaindre arrêter la fermeture du compilateur avec cet avertissement:

  • Ne pas utiliser directement link.onclick = ..., parce que vous devez jouer avec this et e || window.event. Au lieu de cela, utilisez jQuery pour envelopper le gestionnaire d'événements, car jQuery's event object has e.currentTarget.
  • Si vous utilisez this dans un jQuery.each, remplacez this par le second paramètre de votre fonction. Par exemple, jQuery.each([1, 2, 3], function(i, val) { ... val ... };.
1

Je ne sais pas JQuery très bien mais je pense que vous pouvez utiliser quelque chose comme:

function aToggle(event) { 
    if(shown) { 
    toggle.show(); 
    } else { 
    toggle.hide(); 
    } 
    $(event.target).text(shown ? 'Click to hide' : 'Click to show'); 
    shown = !shown; 
} 

$(link).bind('click', aToggle); 

où vous récupérez la cible cliquée d'un objet événement générique croix navigateur.

EDIT: pour un conseil, utilisez { } avec votre if else et utilisez des points-virgules, ne comptez pas sur votre navigateur pour le faire pour vous.

Pour tirer le meilleur parti des outils de fermeture, il est conseillé d'utiliser la bibliothèque de fermeture en combinaison avec le compilateur (mais pas nécessaire)

+0

Pourquoi, jour après jour, dois-je utiliser des accolades et des points-virgules? –

+0

'devrait' est peut-être un peu fort mais les accolades améliorent vraiment la lisibilité des programmes où il est utilisé pour grouper le code. Points-virgules: http://stackoverflow.com/questions/444080/do-you-recommend-using-semicolons-after-every-statement-in-javascript. Mais plus important encore, ma solution fonctionne-t-elle pour vous? – Jan

+0

Je ne l'ai pas encore testé, j'ai été déplacé vers d'autres projets mais je n'oublierai pas de revenir à accepter la bonne réponse. J'ai regardé le compilateur et il enlève les accolades et ajoute les points-virgules, ce qui est sympa. Merci de le mentionner. –

1

D'abord, vous faites probablement mal. :-)

@Jan avait la bonne idée. Mais vous devriez probablement aller avec ce qui suit:

(function(){ 
    var toggle = $("#toggle"); 
    $("#yourLinksID, .orClassName").click(function(e) { 
     var shown = toggle.toggle().is(":visible"); 
     $(this).html(shown ? "Click to hide" : "Click to show"); 
     e.preventDefault(); 
    }); 
}()); 

et lors de la compilation:

Utilisez le fichier externals jQuery suivant qui indique la fermeture du compilateur ce qui fait quoi dans jQuery: http://code.google.com/p/closure-compiler/source/browse/trunk/contrib/externs/jquery-1.4.3.externs.js

Si vous voulez juste la message d'avertissement pour disparaître remplacer this avec link.

+0

Il existe un fichier externs à jour http://code.google.com/p/closure-compiler/source/browse/trunk/contrib/externs/jquery-1.4.3.externs.js –

+0

J'utilise aToggle dans d'autres endroits, donc je ne peux pas simplement remplacer 'this' par' link'. Le code ci-dessus est juste un exemple que j'ai écrit. Merci pour la réponse, je vais l'essayer bientôt. –

+0

@GeorgeBailey Ah, je n'ai pas vérifié pour une mise à jour. Cela faisait si longtemps que la version 1.3.2 n'avait pas été mise à jour. Je vais mettre à jour ma réponse. –

Questions connexes