J'ai examiné à travers beaucoup de poteaux de blog, de documentation, etc. sur le mode strict de JavaScript. P>
J'ai remarqué qu'il y a beaucoup de restrictions sur le mot clé Supprimer. Je ne sais même pas si vous pouviez les appeler des restrictions. Il semble que J'aimerais utiliser le mode strict. C'est une bonne idée. Mais je pense aussi que Supprimer est une bonne idée. P>
Y a-t-il des moyens alternatifs de "supprimer" une variable? p> suppression code> ne fonctionne plus. P>
3 Réponses :
Vous n'êtes pas Pourquoi avez-vous besoin de supprimer une variable locale de la portée? Vous pouvez simplement définir la variable pour être une autre façon de vérifier les agressions indéfinies serait en train de faire Supprimer code> variables.
Supprimer code> est utilisé pour supprimer une propriété d'un objet. p>
Supprimer le FOO. A code> Supprimera la propriété
"A" code> à partir de l'objet
foo code>. p>
non défini code> p>
foo === vide 0 < / Code> Etant donné que
void code> est un opérateur qui exécute l'expression suivant et renvoie
non défini code>. C'est une astuce intelligente. P> p>
Il n'est pas recommandé de définir des variables sur la valeur de non défini code> car dans les versions JS non strictes La valeur de
non définie code> peut être manipulée.
@Eli mais vous allez avoir une valeur locale de non défini code> non définie? Outre si vous trouvez un code qui manipule la brûlure indéfinie, interdit ensuite l'auteur d'utiliser JavacRip.
Ce n'est pas local. C'est une variable globale appelée config code>.
@tylermwashburn Supprimer la fenêtre.config code>. Mais sérieusement, pourquoi est-il nécessaire d'être global, il y a un meilleur modèle à ce que vous faites, vous ne le savez tout simplement pas.
Je ne peux pas penser à une instance où j'en ai jamais eu besoin. Pour la comparaison, il est toujours recommandé de taper comparer et non de valeur Comparer: typeof foo === 'non défini' code> est préféré sur
foo == non défini code>. Une variable doit être recueillie une fois que le moteur détermine qu'elle ne sera plus accessible en déterminant si elle peut être référencée à l'extérieur. C'est pourquoi le cadre correct est si important. Peu importe si cela est indéfini, car la définition d'une variable à indéfinie ne le détruira pas. Je recommande vivement cette lecture: perfectionkills.com/unerstanding-Delete
Et si une personne change la valeur de non défini code> dans la portée locale? Je sais que les chances de cela sont petites, mais il s'agit de la meilleure pratique. Si vous ne devriez pas l'utiliser d'une manière d'une manière, pourquoi est-ce une bonne idée?
@Eli Il n'est que nécessaire pour vérifier avec typeof code> si la variable pourrait n'exister peut-être pas. Si la variable existe et que je veux savoir s'il a une valeur définie, je vérifie la variable
=== non définie code>.
@Eli Si une personne change la valeur de non défini code> dans la portée locale a), vous avez un collègue incompétent ou B) votre utilisation
eval code>. Pour a) Vous lui apprenez comment écrire JavaScript et corriger le bogue. Pour b) vous arrêtez d'utiliser
eval code>.
C'est votre propre décision de comparer l'encontre d'undefined, je vous conseille de savoir que la plupart des Gurus JS recommandent contre cela, car indéfini est mutable. Et si avant votre variable === non défini code> Vérifiez I Mettez
non défini = 3; code>? Votre code échouerait. Je comprends que la chance de ceci est petite, mais quelqu'un pourrait facilement casser quelque chose en disant
si (variable = non défini) code>. C'est beaucoup plus subtil, mais le concept s'applique toujours.
Je comprends que quelqu'un ne devrait pas le faire, mais parfois, vous ne pouvez pas arrêter stupide. C'est juste la raison pour laquelle ce n'est pas fait.
@Raynos qu'est-ce que cela serait-il alors?
Stackoverflow.com/questions/4725603/... < / a>
@Eli, je n'ai pas besoin d'écrire un code de protection idiot. L'écriture de code de défense hyperly est tout aussi mauvais que la micro optimisation. Ce n'est tout simplement pas nécessaire. Si quelqu'un met non défini = 3 code> dans mon code, cela devient leur problème, pas le mien. Ce que vous parlez de bugs et de fautes de frappe qui seront corrigés. Le code comme celui-là n'est pas i> entrer dans la production. Le code comme celui-là n'est pas i> Evaluez l'examen par les pairs.
Tout ce que j'essaie de dire, c'est que pendant que vous pouvez comparer à indéfinir, il est considéré comme une mauvaise pratique de le faire.
@Eli c'est une mauvaise pratique de comparer contre le global i> non défini code>. Comparaison contre un
non défini code> est sûr.
@Raynos Que soit-il si vous battez du code et oubliez des signes égaux? si (variable = non défini) code>. C'est une erreur commune, pourquoi prendre la chance que cela puisse jamais arriver.
Désolé @raynos, ils peuvent tous être modifiés. C'est pourquoi les JS stricts dans le futur non défini sont immuables à cause de ce problème.
@Eli code critique. Essai. etc. Ce que vous avez il y a un bug i>. Les bugs ne vont pas dans le code libéré. C'est la même chose qu'une faute de frappe comme faire winddw.creeeelement code> pauses. Je ne défends pas à Againts que parce que des insectes comme ceux-ci sont pris en charge par examen et test, sans parler des dames de syntaxe et JSlint.
Je comprends que c'est faux. Mais vous ne pouvez pas toujours empêcher les insectes d'entrer dans la production. Je ne tire pas ces meilleures pratiques de l'air mince. Cela a été recommencé à maintes reprises par des ingénieurs JS brillants et pour une bonne raison. J'essaie simplement de vous informer de la façon dont les autres évitent de toujours courir dans le problème pour commencer.
@Eli il n'y a rien de mal avec le chèque de type de type code>, c'est parfaitement valide. Mais il n'y a aucune raison d'interdire l'utilisation de
non définie code> comme une variable locale dans la source que vous avez le contrôle. "Je ne peux pas toujours empêcher les insectes d'entrer dans la production" qui est correct. Mais faire
= code> dans une instruction IF ou attribuer une valeur à
non défini code> n'est pas l'un de ces bugs. Les bugs qui entrent dans la production sont soit des conditions de course, des cas de bord complexes ou des bugs par conception. Il devrait simplement être le choix personnel d'utiliser
non défini code> localement ou non.
Je n'essaie pas de dire que vous devriez changer votre façon de faire des choses. Je déteste juste voir une pratique promue qui va à l'encontre d'une meilleure pratique établie établie b>.
Je suis totalement d'accord: si vous souhaitez comparer contre non défini qui vous appartient. J'essaie juste de rendre les autres conscients qu'il est recommandé d'être fait d'une autre manière.
@Eli à nouveau La meilleure pratique établie b> est de ne pas utiliser global non défini code>. Une copie locale de
non définie code> doit être considérée comme sûre si vous avez le contrôle de votre code source et que vous êtes compétent. En dehors de Crockford Nom Me un expert respectable qui interdit l'utilisation de
non défini code>.
Mais c'est incompatible. Au lieu de le faire deux manières différentes selon votre environnement, vous pouvez le faire de la même manière dans tous. C'est un certitude pour la maintenance.
@Eli "en fonction de votre environnement" Que voulez-vous dire? Comment est-ce incompatible? Si je suis dans un environnement où non défini code> est abusé, je vais refactor i> que pour eux.
John Resig, Stoyan Stefanov, Nicolas Zakas pour en nommer quelques-uns.
Que diriez-vous de définir simplement vos variables sur hth. p>
EDIT: strong> comme @chris Buckler mentionné dans les commentaires, cela ne peut pas être effectué à la portée globale, car les variables globales ne reçoivent jamais des ordures recueillies. P> NULL code>? Une fois que vous avez défini les variables sur
null code>, le collecteur de déchets JavaScript supprimera toutes les variables non référencées lors de la prochaine exécution. P>
Faire cela affectera la valeur à NULL, mais la variable ne sera pas réellement détruite.
@Chris - le réglage à NULL sera normalement i> (s'il n'y a plus de références à la variable) le rendre éligible à GC. Malheureusement, cela ne s'applique pas aux variables globales selon Stackoverflow. com / Questions / 864516 / ... , mais la question ne nous a pas éclairée au fait que l'OP faisait référence à une variable globale.
Si vous deviez faire quelque chose comme pour (accessoire global) code>,
config code> serait toujours exécuté pour.
Comme les autres font allusion, vous n'avez jamais besoin de Avez-vous un autre espace de noms global autre que la fenêtre globale code> Windows code> Cela vous profiterait probablement d'avoir quelque chose comme ça pour cette situation: p> pour une compréhension approfondie réelle de la suppression et du non défini dans JS: P> http://perfectionkills.com/unStanding-Delete/ P> http:/scottdowne.wordpress.com/2010/11 / 28 / JavaScript-typeof-Undefined-vs-non défini / p> Comment vérifier si un objet a une propriété en JavaScript? P> P> Supprimer CODE> Variables. Cela ressemble davantage à une question de ne pas contrôler correctement la portée. Si vous conservez vos variables dans une portée de la fonction, elles seront traitées de mémoire une fois que elles ne sont plus référencées.
J'ai une variable globale config code> utilisé pour configurer certaines choses dans un fichier JavaScript. Je veux le supprimer après que cela a fait le chargement, mais cela jette une erreur et la laisse là-bas. La ligne est
Supprimer global.config; code>.
L'objet de configuration doit être défini avant l'exécution du script.
Cela n'affectera pas l'applicabilité de ce que j'ai dit. Avez-vous un échantillon de la manière dont votre configuration est initialisée?
@Tylerwashburn Si vous souhaitez supprimer de Global Scope Suppr de la fenêtre code> code>. La portée globale et l'objet de la fenêtre sont les mêmes. Just Supprimer la fenêtre.config code>
L'esprit nous disait ce que vous essayez d'atteindre? Comme il se distingue, la question se lit comme une déclaration.
Cela ressemble à des hes à la recherche d'une alternative au mot clé Supprimer pour supprimer une variable en JavaScript ...