Maison interface Web js tutoriel Divers pièges et méthodes de remplissage des pièges dans le code JavaScript compétences d'écriture_javascript

Divers pièges et méthodes de remplissage des pièges dans le code JavaScript compétences d'écriture_javascript

May 16, 2016 pm 04:45 PM
javascript

Le mot « fosse » signifie ici « piège ». En raison de la nature du « langage faible » de JavaScript, il est extrêmement lâche et flexible lors de son utilisation, mais il est également extrêmement facile de « tomber dans ces pièges ». caché , vous devez donc garder les yeux ouverts pour pouvoir voyager en douceur sur la voie de l'apprentissage et de l'application de JS

1. Variables globales

JavaScript gère la portée via des fonctions. Les variables déclarées à l'intérieur d'une fonction ne sont disponibles qu'à l'intérieur de la fonction et ne sont pas disponibles en dehors de la fonction. En revanche, les variables globales sont déclarées en dehors de toute fonction ou simplement utilisées sans être déclarées.

"Utilisation simple sans déclaration" fait référence à la déclaration de variables sans utiliser le mot-clé var. Nous le savons déjà très bien. Le moyen d’éviter de générer implicitement des variables globales est de déclarer autant que possible les variables en utilisant le mot-clé var.

Mais pensez-vous qu'utiliser var est acceptable ? Jetons un coup d'oeil à cette fosse :

Copiez le code Le code est le suivant :

function foo() {
var a = b = 0;
// corps...
}

Peut-être vous attendiez-vous à deux variables locales, mais b est une vraie variable globale. pourquoi ? Parce que les opérations d'affectation se font de droite à gauche, cela équivaut donc à :

Copier le code Le code est le suivant :

function foo() {
var a = (b = 0);
// corps...
}

Donc b est une variable globale.

Remplissez le trou : déclarations de variables, il vaut mieux les faire une par une, ne pas faire en gros~_~;

2. Déclaration de variable

Regardons d'abord les pièges :

Copier le code Le code est le suivant :

myName = "global";

function foo() {
alert(myName);
var myName = "local ";
alert(myName);
}

foo();

À première vue, on s'attend à ce que les résultats des deux alertes soient "globaux" et "locals ", mais le réel Les résultats sont "indéfinis" et "locals". pourquoi ? Étant donné que les variables sont dans la même portée (même fonction), les déclarations sont placées en haut de la portée et analysées en premier.

Le comportement d'exécution de l'extrait de code ci-dessus pourrait donc être le suivant :

Copiez le code Le code est le suivant :

function foo() {
var monNom;
alert(monNom); // "non défini"
monNom = "local";
alert(monNom); // "local"
}

Utilisez une autre fosse pour tester si vous comprenez vraiment la pré-analyse :
Copier le code Le code est le suivant :

if (!("a" dans la fenêtre)) {
var a = 1;
}

alerte (a);

La déclaration d'une variable est avancée en haut du code et n'a pas encore reçu de valeur. Ensuite, entrez l'instruction if. La condition de jugement "a" dans la fenêtre a été établie (a a été déclarée comme variable globale), donc le résultat de l'évaluation de l'instruction de jugement est faux, et l'instruction if est sautée directement, donc l'instruction if. la valeur de a n’est pas définie.
Copier le code Le code est le suivant :

var a; // "indéfini"
console .log("a" in window); // true

if (!("a" in window)) {
var a = 1; // Ne pas exécuter
>

alert(a); // "undefined"

Remplissez la fosse : déclaration de variable, il est préférable de la placer manuellement en haut de la portée Pour les variables qui ne peuvent pas l'être. attribué immédiatement, vous pouvez d'abord déclarer puis attribuer.

3. Déclaration de fonction

Les déclarations de fonctions sont également avancées en haut de la portée, analysées et évaluées avant toute expression et instruction

Copier le codeLe le code est le suivant :

alert(typeof foo); // "function"

function foo() {
// body...
}

Vous pouvez comparer :
Copiez le code Le code est le suivant :

alert(typeof foo); // "indéfini"

var foo = function () {
// corps...
};

Après avoir compris cette vérité, tomberez-vous encore dans les pièges suivants ?

Copier le code Le code est le suivant :

function test() {
alerte ("1");
}

test();

function test() {
alert("2");
}

test( );

Exécutez l'extrait de code ci-dessus et les deux fenêtres contextuelles que vous voyez affichent "2". Pourquoi ne sont-elles pas respectivement "1" et "2" ? Très simplement, la déclaration de test est analysée avant test(), et comme cette dernière écrase la première, le résultat des deux exécutions est "2".

Remplissez le trou : dans la plupart des cas, j'utilise des expressions de fonction au lieu de déclarations de fonction, en particulier dans certains blocs d'instructions.

4. Expressions de fonction

Regardons d'abord les expressions de fonction nommées Bien sûr, elles doivent avoir un nom, par exemple :

Copier le code Le code est le suivant :
var bar = function foo() {
// body...
};
Il est à noter que le nom de la fonction n'est visible qu'à l'intérieur de sa fonction. Tels que les écueils suivants :

Copier le code Le code est le suivant :
var bar = function foo() {
foo(); // Fonctionnement normal
};

foo(); // Erreur : ReferenceError
Remplissez le trou : utilisez le moins possible les expressions de fonctions nommées (sauf à des fins de récursivité et de débogage) et n'utilisez jamais de noms de fonctions en externe.

5. Auto-exécution des fonctions

Pour les expressions de fonction, vous pouvez vous auto-exécuter en ajoutant () après, et vous pouvez passer des paramètres entre parenthèses, mais les déclarations de fonction ne le peuvent pas. . Piège :

Copier le code Le code est le suivant :
// (1) Ceci est juste un symbole d'opération de regroupement, pas un appel de fonction !
// Donc la fonction ici n'a pas été exécutée, c'est toujours une instruction
function foo(x) {
alert(x);
}(1);
Les extraits de code suivants sont respectivement La fenêtre contextuelle affiche "1" pendant l'exécution, car tout ce qui précède (1) est une expression de fonction, donc () ici n'est pas un opérateur de regroupement, mais un opérateur indiquant l'exécution de l'appel.

Copier le code Le code est le suivant :
// Expression de fonction anonyme standard
var bar = function foo(x) {
alert(x);
}(1);

// Le précédent () convertit la déclaration de fonction en une expression
(function foo(x) {
alert(x);
})(1);

// Le tout () est l'expression
(function foo(x) {
alert(x) ;
}(1));

// nouvelle expression
nouvelle fonction foo(x) {
alert(x);
}(1);

// &&, ||, !, , -, ~ opérateurs (et virgules), lever l'ambiguïté des expressions de fonction et des déclarations de fonction
// donc une fois que l'analyseur sait que l'un d'eux est déjà une expression, et tout le reste est par défaut aux expressions
true && function foo(x) {
alert(x);
}(1);
Remplissez la fosse : cette fosse La clé est de comprendre l'essence de diverses expressions de fonctions.

6. Fermetures en boucles
Ce qui suit démontre un piège courant :

Copier le code Le code est le suivant :




   
Document


   

lorsque vous cliquez sur les liens ci-dessous, affichez le numéro de sa séquence


    < ;ul>
       
  • link #0

  •        
  • link #1

  •        
  • lien #2

  •        
  • lien n°3

  •        
  • lien n°4

  •    


    复制代码 代码如下 :

    var links = document.getElementsByTagName("ul")[ 0].getElementsByTagName("a");

    for (var i = 0, l = links.length; i < l; i ) {
        links[i].onclick = function (e ) {
            e.preventDefault();
            alert("Vous cliquez sur le lien #" i);
        }       
    }

    我们预期当点击第 i 个链接时,得到此序列索引 i 的值,可实际无论点击哪个链接,得到的都Et je 在循环后的最终结果:”5”。

    解释一下原因:当 alerte 被调用时,pour 循环内的匿名函数表达式,保持了对外部变量 i的引用(闭包),此时循环已结束,i 的值被修改为 « 5 » 。

    填坑 : 为了得到想要的结果 , 需要在每次循环中创建变量 i 的拷贝。以下演示正确的做法 :

    复制代码 代码如下 :


       
        Document


       

    lorsque vous cliquez sur les liens ci-dessous, affichez le nombre de sa séquence


       


    复制代码 代码如下 :

    var links = document.getElementsByTagName(“ul”)[ 0].getElementsByTagName("a");
    for (var i = 0, l = links.length; i < l; i ) {
        links[i].onclick = (function (index) {

    Comme vous pouvez le voir, la forme de (function () { ... })() est l'auto-exécution de la fonction mentionnée ci-dessus, i est transmise à l'index en tant que paramètre. Lorsque l'alerte est à nouveau exécutée, elle est transmise à l'index. aura une référence à l'index, cette valeur ne sera pas modifiée cycliquement pour le moment. Bien sûr, après avoir compris le principe, vous pouvez aussi écrire comme ceci :

    Copier le code Le code est le suivant :

    pour (var i = 0, l = links.length ; i < l; i ) {
    (fonction (index) {
    links[i].onclick = function (e) {
    e.preventDefault();
    alert( "Vous cliquez sur le lien #" index);
    }
    })(i);
    }

    Ça marche aussi.

    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

    Outils d'IA chauds

    Undresser.AI Undress

    Undresser.AI Undress

    Application basée sur l'IA pour créer des photos de nu réalistes

    AI Clothes Remover

    AI Clothes Remover

    Outil d'IA en ligne pour supprimer les vêtements des photos.

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    AI Hentai Generator

    AI Hentai Generator

    Générez AI Hentai gratuitement.

    Article chaud

    R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
    1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Meilleurs paramètres graphiques
    1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
    Will R.E.P.O. Vous avez un jeu croisé?
    1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

    Outils chauds

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    Éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

    Logiciel d'édition de code au niveau de Dieu (SublimeText3)

    Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 pm 02:54 PM

    Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de reconnaissance vocale en ligne Introduction : Avec le développement continu de la technologie, la technologie de reconnaissance vocale est devenue une partie importante du domaine de l'intelligence artificielle. Le système de reconnaissance vocale en ligne basé sur WebSocket et JavaScript présente les caractéristiques d'une faible latence, d'un temps réel et d'une multiplateforme, et est devenu une solution largement utilisée. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de reconnaissance vocale en ligne.

    WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel Dec 17, 2023 pm 05:30 PM

    WebSocket et JavaScript : technologies clés pour réaliser des systèmes de surveillance en temps réel Introduction : Avec le développement rapide de la technologie Internet, les systèmes de surveillance en temps réel ont été largement utilisés dans divers domaines. L'une des technologies clés pour réaliser une surveillance en temps réel est la combinaison de WebSocket et de JavaScript. Cet article présentera l'application de WebSocket et JavaScript dans les systèmes de surveillance en temps réel, donnera des exemples de code et expliquera leurs principes de mise en œuvre en détail. 1. Technologie WebSocket

    Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Dec 17, 2023 pm 12:09 PM

    Introduction à l'utilisation de JavaScript et de WebSocket pour mettre en œuvre un système de commande en ligne en temps réel : avec la popularité d'Internet et les progrès de la technologie, de plus en plus de restaurants ont commencé à proposer des services de commande en ligne. Afin de mettre en œuvre un système de commande en ligne en temps réel, nous pouvons utiliser les technologies JavaScript et WebSocket. WebSocket est un protocole de communication full-duplex basé sur le protocole TCP, qui peut réaliser une communication bidirectionnelle en temps réel entre le client et le serveur. Dans le système de commande en ligne en temps réel, lorsque l'utilisateur sélectionne des plats et passe une commande

    Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 am 09:39 AM

    Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de réservation en ligne. À l'ère numérique d'aujourd'hui, de plus en plus d'entreprises et de services doivent fournir des fonctions de réservation en ligne. Il est crucial de mettre en place un système de réservation en ligne efficace et en temps réel. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de réservation en ligne et fournit des exemples de code spécifiques. 1. Qu'est-ce que WebSocket ? WebSocket est une méthode full-duplex sur une seule connexion TCP.

    JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel Dec 17, 2023 pm 05:13 PM

    JavaScript et WebSocket : Construire un système efficace de prévisions météorologiques en temps réel Introduction : Aujourd'hui, la précision des prévisions météorologiques revêt une grande importance pour la vie quotidienne et la prise de décision. À mesure que la technologie évolue, nous pouvons fournir des prévisions météorologiques plus précises et plus fiables en obtenant des données météorologiques en temps réel. Dans cet article, nous apprendrons comment utiliser la technologie JavaScript et WebSocket pour créer un système efficace de prévisions météorologiques en temps réel. Cet article démontrera le processus de mise en œuvre à travers des exemples de code spécifiques. Nous

    Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Jan 05, 2024 pm 06:08 PM

    Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

    Comment utiliser insertBefore en javascript Comment utiliser insertBefore en javascript Nov 24, 2023 am 11:56 AM

    Utilisation : En JavaScript, la méthode insertBefore() est utilisée pour insérer un nouveau nœud dans l'arborescence DOM. Cette méthode nécessite deux paramètres : le nouveau nœud à insérer et le nœud de référence (c'est-à-dire le nœud où le nouveau nœud sera inséré).

    JavaScript et WebSocket : créer un système de traitement d'images en temps réel efficace JavaScript et WebSocket : créer un système de traitement d'images en temps réel efficace Dec 17, 2023 am 08:41 AM

    JavaScript est un langage de programmation largement utilisé dans le développement Web, tandis que WebSocket est un protocole réseau utilisé pour la communication en temps réel. En combinant les puissantes fonctions des deux, nous pouvons créer un système efficace de traitement d’images en temps réel. Cet article présentera comment implémenter ce système à l'aide de JavaScript et WebSocket, et fournira des exemples de code spécifiques. Tout d’abord, nous devons clarifier les exigences et les objectifs du système de traitement d’images en temps réel. Supposons que nous disposions d'un appareil photo capable de collecter des données d'image en temps réel.

    See all articles