Vous êtes la plupart du temps très bien, vous pouvez accéder directement à globalVar
de tout script en cours d'exécution dans toute la page si vous déclarez-le comme vous l'avez fait.
Plus précisément: Utilisation var x;
à périmètre niveau de la page (qui est, en dehors de toute fonction) Déclare une propriété sur l'objet window
(il a une particularité en ce qu'elle ne peut pas être supprimé, mais ce n'est pas important ici) .
var foo = 2;
window.foo = 2; // Basically the same other than the delete thing we're not worrying about here
Et:
var foo = 2;
alert(foo); // alerts "2"
alert(window.foo); // also alerts "2"
window.bar = 4;
alert(window.bar); // alerts "4"
alert(bar); // also alerts "4"
Naturellement, cela est vrai qu'au niveau supérieur, en dehors de toutes les fonctions. À l'intérieur fonctions, vous déclarez quelque chose de local à la fonction. (En substance, il est en fait beaucoup plus intéressant que cela.)
Mais puisque vous avez posé des questions sur la portée, il ne vaut rien que toutes les autres choses que vous avez défini (initialize
, getTheVar
, doSomething
) sont aussi globaux. En général, vous voulez éviter de mettre quoi que ce soit dans l'espace de noms global que vous pouvez éviter d'y mettre.
Pour cette raison, je préconise toujours l'aide d'une « fonction de cadrage »:
(function() {
// your code here
})();
... et explicitement exporter exactement et que les choses que vous avez vraiment besoin d'être global (en les affectant à des propriétés sur window
).
Dans votre cas, vous avez dit que vous avez besoin globalVar
et vous avez également utilisé initialize
(bien qu'il existe d'autres façons de faire ce que vous faites dans initialize
), vous pouvez le faire:
(function() {
var globalvar;
// Exports
window.globalVar = globalVar;
window.initialize = initialize;
// Implementation
function initialize() {
var someVariable = 5;
doSomething(someVariable, getTheVar);
}
function doSomething(someVariable, expectGlobalVar) {
//alert(someVariable);
alert(expectGlobalVar);
}
function getTheVar() {
globalVar = "test";
return globalVar;
}
})();
Mais vous pouvez aller plus loin. Puisque vous n'appelez pas initialize
jusqu'à l'événement load
de l'élément body
, vous pouvez éviter de publier initialize
. Il suffit de mettre votre balise de script à la fin du document, juste avant la balise de fermeture </body>
(comme the YUI folks recommandent), et faites votre initialisation là:
<html>
<head>
<title>...</title>
</head>
<body>This is a test
<script type='text/javascript'>
(function() {
var globalvar;
// Initialization
initialize();
// Exports
window.globalVar = globalVar;
// Implementation
function initialize() {
var someVariable = 5;
doSomething(someVariable, getTheVar);
}
function doSomething(someVariable, expectGlobalVar) {
//alert(someVariable);
alert(expectGlobalVar);
}
function getTheVar() {
globalVar = "test";
return globalVar;
}
})();
</script>
</body>
</html>
Le DOM est fully loaded and ready to go à ce moment-là.
Mais nous pouvons aller encore plus loin si nous voulons: Nous pouvons avoir rien dans l'espace de noms global si l'on veut. Si vous connectez tous vos gestionnaires dans votre fonction initialize
plutôt que d'utiliser onload
, onclick
et des attributs similaires, il n'est pas nécessaire que globalVar
soit global sauf votre code. (Vous brancher gestionnaires après le fait à l'aide attachEvent
[sur IE], addEventListener
[sur les navigateurs basés sur les standards], ou mieux encore en utilisant une bibliothèque comme jQuery, Closure, Prototype, YUI ou any of several others.)
Pouvez-vous fournir plus de détails sur votre problème exact? Autant que je sache, ce code devrait fonctionner. Je ne suis pas tout à fait sûr si l'alerte appellera la fonction que vous remettez ou juste retourner le pointeur de fonction. Cela pourrait être facilement résolu en mettant() derrière le nom de la fonction dans l'instruction d'alerte. – philgiese
Vous avez deux variables nommées de la même façon, à l'exception de la capitalisation ('globalvar' et' globalVar'), c'est une très mauvaise pratique, vous les confondez facilement pour être les mêmes. – aaaaaaaaaaaa
@ eBusiness: En effet. En fait, je m'attends à ce que ce soit * une * erreur, plutôt que quelque chose d'intentionnel. –