Variable javascript globale dans le document.prêt

Quelle est la bonne façon de déclarer une variable JavaScript globale? La façon dont je l'essaie, ne fonctionne pas

$(document).ready(function() {

    var intro;

    if ($('.intro_check').is(':checked')) {
        intro = true;
        $('.intro').wrap('<div class="disabled"></div>');
    };

    $('.intro_check').change(function(){
        if(this.checked) {
            intro = false;
            $('.enabled').removeClass('enabled').addClass('disabled');
        } else {
            intro = true;
            if($('.intro').exists()) {
                $('.disabled').removeClass('disabled').addClass('enabled'); 
            } else {
                $('.intro').wrap('<div class="disabled"></div>');
            }
        }
    });
});

console.log(intro);
30
demandé sur McGarnagle 2012-06-22 12:50:30

8 réponses

Si vous déclarez une variable globale, vous pouvez utiliser un espace de noms quelconque. Déclarez simplement l'espace de noms à l'extérieur, puis vous pouvez y jeter tout ce que vous voulez. Pareil...

var MyProject = {};
$(document).ready(function() {
    MyProject.intro = "";

    MyProject.intro = "something";
});

console.log(MyProject.intro); // "something"
65
répondu McGarnagle 2012-06-22 08:53:29

Déclarez ceci

var intro;

En dehors de $(document).ready() parce que, {[5] } cachera votre variable de la portée globale.

Code

var intro;

$(document).ready(function() {
    if ($('.intro_check').is(':checked')) {
        intro = true;
        $('.intro').wrap('<div class="disabled"></div>');
    };
    $('.intro_check').change(function(){
        if(this.checked) {
            intro = false;
            $('.enabled').removeClass('enabled').addClass('disabled');
        } else {
            intro = true;
            if($('.intro').exists()) {
                $('.disabled').removeClass('disabled').addClass('enabled'); 
            } else {
                $('.intro').wrap('<div class="disabled"></div>');
            }
        }
    });
});

Selon @Zakaria commentaire

Une Autre façon:

window.intro = undefined;

$(document).ready(function() {
    if ($('.intro_check').is(':checked')) {
        window.intro = true;
        $('.intro').wrap('<div class="disabled"></div>');
    };
    $('.intro_check').change(function(){
        if(this.checked) {
            window.intro = false;
            $('.enabled').removeClass('enabled').addClass('disabled');
        } else {
            window.intro = true;
            if($('.intro').exists()) {
                $('.disabled').removeClass('disabled').addClass('enabled'); 
            } else {
                $('.intro').wrap('<div class="disabled"></div>');
            }
        }
    });
});

Note

console.log(intro);

En dehors de la fonction Dom ready (Actuellement vous avez) se connectera undefined, mais dans DOM ready il vous donnera true / false.

Votre console.log externe s'exécute avant L'exécution DOM ready, car DOM ready s'exécute après tout la ressource est apparue à DOM, c'est-à-dire après la préparation de DOM, donc je pense que vous obtiendrez toujours un résultat absurde.


Selon le commentaire de @ W0rldart

Je dois l'utiliser en dehors de la fonction Dom ready

, Vous pouvez utiliser l'approche suivante:

var intro = undefined;

$(document).ready(function() {
    if ($('.intro_check').is(':checked')) {
        intro = true;
        introCheck();
        $('.intro').wrap('<div class="disabled"></div>');
    };
    $('.intro_check').change(function() {
        if (this.checked) {
            intro = true;
        } else {
            intro = false;
        }
        introCheck();
    });

});

function introCheck() {
    console.log(intro);
}

Après avoir changé la valeur de intro j'ai appelé une fonction qui se déclenchera avec une nouvelle valeur de intro.

29
répondu thecodeparadox 2012-06-22 09:33:48

JavaScript a une portée variableau niveau de la fonction , ce qui signifie que vous devrez déclarer votre variable en dehors de la fonction $(document).ready().

Ou alternativement pour que votre variable ait Global scope, n'utilisez simplement pas var mot-clé avant comme indiqué ci-dessous. Cependant, en général, cela est considéré comme une mauvaise pratique car cela pollue la portée globale mais c'est à vous de décider.

$(document).ready(function() {
   intro = null; // it is in global scope now

Pour en savoir plus, consultez sortie:

14
répondu Sarfraz 2012-06-22 09:03:02

Utiliser window.intro à l'intérieur de $(document).ready().

7
répondu xdazz 2012-06-22 08:53:03

Comme ceci: mettez intro en dehors de votre document prêt, bonne discussion ici: http://forum.jquery.com/topic/how-do-i-declare-a-global-variable-in-jquery @thecodeparadox est incroyablement rapide: P de toute façon!

 var intro;

$(document).ready(function() {



    if ($('.intro_check').is(':checked')) {
        intro = true;
        $('.intro').wrap('<div class="disabled"></div>');
    };

    $('.intro_check').change(function(){
        if(this.checked) {
            intro = false;
            $('.enabled').removeClass('enabled').addClass('disabled');
        } else {
            intro = true;
            if($('.intro').exists()) {
                $('.disabled').removeClass('disabled').addClass('enabled'); 
            } else {
                $('.intro').wrap('<div class="disabled"></div>');
            }
        }
    });
});
2
répondu Tats_innit 2012-06-22 08:52:00

Contrairement à d'autres langages de programmation, toute variable déclarée en dehors d'une fonction devient automatiquement globale,

<script>

//declare global variable
var __foo = '123';

function __test(){
 //__foo is global and visible here
 alert(__foo);
}

//so, it will alert '123'
__test();

</script>

Votre problème est que vous déclarez variable à l'intérieur ready() Fonction, ce qui signifie qu'il devient visible (dans la portée) seulement à l'intérieur ready() fonction, mais pas à l'extérieur,

Solution: Donc, il suffit de le rendre global, c'est-à-dire déclarer celui-ci à l'extérieur $(document).ready(function(){});

2
répondu Yang 2012-06-22 08:59:46

Utilisez window.intro = "value"; dans la fonction ready. "value" peut être void 0 si vous voulez qu'il soit undefined

1
répondu Esailija 2012-06-22 08:52:31

Vous pouvez définir la variable dans la fonction document ready sans var pour en faire une variable globale. En javascript toute variable déclarée sans var devient automatiquement une variable globale

$(document).ready(function() {
    intro =  "something";
});

Bien que vous ne puissiez pas utiliser la variable immédiatement, mais elle serait accessible à d'autres fonctions

1
répondu Joshua 2017-06-28 06:10:28