Est-il possible de définir une variable globale dans une fonction JavaScript?
Je veux utiliser la trailimage
variable (déclarée dans la makeObj
fonction) dans d'autres fonctions.
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<script type="text/javascript">
var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
function makeObj(address) {
**var trailimage = [address, 50, 50];**
document.write('<img id="trailimageid" src="' + trailimage[0] + '" border="0" style=" position: absolute; visibility:visible; left: 0px; top: 0px; width: ' + trailimage[1] + 'px; height: ' + trailimage[2] + 'px">');
obj_selected = 1;
}
function truebody() {
return (!window.opera && document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
}
function hidetrail() {
var x = document.getElementById("trailimageid").style;
x.visibility = "hidden";
document.onmousemove = "";
}
function followmouse(e) {
var xcoord = offsetfrommouse[0];
var ycoord = offsetfrommouse[1];
var x = document.getElementById("trailimageid").style;
if (typeof e != "undefined") {
xcoord += e.pageX;
ycoord += e.pageY;
}
else if (typeof window.event != "undefined") {
xcoord += truebody().scrollLeft + event.clientX;
ycoord += truebody().scrollTop + event.clientY;
}
var docwidth = 1395;
var docheight = 676;
if (xcoord + trailimage[1] + 3 > docwidth || ycoord + trailimage[2] > docheight) {
x.display = "none";
alert("inja");
}
else
x.display = "";
x.left = xcoord + "px";
x.top = ycoord + "px";
}
if (obj_selected = 1) {
alert("obj_selected = true");
document.onmousemove = followmouse;
if (displayduration > 0)
setTimeout("hidetrail()", displayduration * 1000);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<img alt="" id="house" src="Pictures/sides/right.gif" style="z-index: 1; left: 372px;
top: 219px; position: absolute; height: 138px; width: 120px" onclick="javascript:makeObj('Pictures/sides/sides-not-clicked.gif');" />
</form>
</body>
</html>
var
ne déclare pas de variable globale. Une conséquence de l'attribution d'une valeur à une variable non déclarée est la création d'une propriété sur l'objet global, ce qui est assez différent de la déclaration d'une variable.Réponses:
Oui, comme les autres l'ont dit, vous pouvez utiliser
var
à portée globale (en dehors de toutes les fonctions) pour déclarer une variable globale:Alternativement, vous pouvez attribuer à une propriété sur
window
:... car dans les navigateurs,
toutes les variables globales les variablesglobales déclarées avecvar
sont des propriétés de l'window
objet. (Dans la dernière spécification, ECMAScript 2015, le nouveaulet
,const
, et lesclass
déclarations à la portée mondiale créer globals qui ne sont pas des propriétés de l'objet global, un nouveau concept ES2015.)(Il y a aussi l'horreur des globaux implicites , mais ne le faites pas exprès et faites de votre mieux pour éviter de le faire par accident, peut-être en utilisant des ES5
"use strict"
.)Cela dit: j'éviterais les variables globales si vous le pouvez (et vous le pouvez presque certainement). Comme je l'ai mentionné, ils finissent par être des propriétés de
window
, etwindow
sont déjà suffisamment encombrés avec tous les éléments avec unid
(et beaucoup avec juste unname
) étant vidés dedans (et indépendamment de cette spécification à venir, IE vide à peu près tout avec unname
là-dessus) ).Au lieu de cela, encapsulez votre code dans une fonction de portée et utilisez des variables locales à cette fonction de portée, et fermez vos autres fonctions en son sein:
la source
window
ne fonctionnera pas dans Node. L'astuce la plus simple consiste à définir:GLOBAL.window = GLOBAL;
- comme expliqué dans cette question connexe . Bien sûr, ce n'est pas assez conceptuellement. Je préfère faire les choses dans l'autre sens, donc je peux utiliser à laGLOBAL
place dewindow
.window.yourGlobalVariable = ...;
fonctionne comme un charme après avoir lu 5 à 6 questions sur le site de la pile.eval
. Au lieu de cela:window[dynamic_variable_name] = dynamic_variable_value;
UPDATE1: Si vous lisez les commentaires, il y a une belle discussion autour de cette convention de nommage particulière.
UPDATE2: Il semble que depuis que ma réponse a été publiée, la convention de dénomination est devenue plus formelle. Les gens qui enseignent, écrivent des livres, etc. parlent de
var
déclaration et defunction
déclaration.UPDATE3: Voici le post wikipedia supplémentaire qui soutient mon point: http://en.wikipedia.org/wiki/Declaration_(computer_programming)#Declarations_and_Definitions
... et pour répondre à la question principale. DECLARE la variable avant votre fonction. Cela fonctionnera et sera conforme à la bonne pratique de déclaration de vos variables en haut de l'étendue :)
la source
definition
quedeclaration
signifie en C. Votre première ligne pourrait être soit une déclaration soit une définition (selon l'endroit où elle se trouve); le second n'est qu'une mission. Une déclaration spécifie simplement l'interprétation de l'identifiant (c'est-à-diremyVar
est unint
); si la déclaration réserve également le stockage, c'est adefinition
. Ceci n'est pas lié à la saisie; cela fait partie de la façon dont les unités de compilation comprennent les références aux autres unités de compilation.var myVar
est appelé déclaration (il n'a pas besoin d'être tapé) etmyVar = 10
une affectation . J'ai entendu le terme "définition" pour le composé (var myVar = 10;
).Déclarez simplement
à l'extérieur. alors
J'espère que cela t'aides.
la source
Non, tu ne peux pas. Déclarez simplement la variable en dehors de la fonction. Vous n'êtes pas obligé de le déclarer en même temps que vous attribuez la valeur:
la source
window
sont synonymes. Quoi qu'il en soit, la distinction sémantique que vous faites est claire, donc cela ne me dérange pas de ne pas voter. Edit: impossible de changer mon vote, désolé!var
, ce que Guffa entendait par implicitement créer (comme @DhruvPathak l'a également indiqué).Il suffit de le déclarer en dehors des fonctions et d'affecter des valeurs à l'intérieur des fonctions. Quelque chose comme:
Ou simplement supprimer "var" de votre nom de variable à l'intérieur de la fonction le rend également global, mais il est préférable de le déclarer une fois à l'extérieur pour un code plus propre. Cela fonctionnera également:
J'espère que cet exemple explique plus: http://jsfiddle.net/qCrGE/
la source
Il est très simple de définir la variable trailimage en dehors de la fonction et de définir sa valeur dans la fonction makeObj. Vous pouvez désormais accéder à sa valeur de n'importe où.
la source
Je me rends compte qu'il y a probablement beaucoup d'erreurs de syntaxe, mais c'est l'idée générale ... Merci beaucoup LayZee de l'avoir signalé ... Vous pouvez trouver ce qu'est un stockage local et de session sur http: //www.w3schools. com / html / html5_webstorage.asp . J'ai eu besoin de la même chose pour mon code et c'était une très bonne idée.
la source
location.reload(false);
rafraîchir à plusieurs reprises.Exemple classique:
Exemple moderne et sûr suivant les meilleures pratiques en utilisant un IIFE :
De nos jours, il y a aussi la possibilité d'utiliser l' API WebStorage
ou
Sur le plan des performances, je ne sais pas si cela est sensiblement plus lent que le stockage de valeurs dans des variables.
Prise en charge étendue du navigateur, comme indiqué sur Puis-je utiliser ...
la source
localStorage.foo = JSON.stringify({ arbitrary: 'object', meaning: 42, awesome: true });
etvar foo = JSON.decode(localStorage.foo);
.localStorage
rapport avec les variables globales?Vous voulez donc que la variable à l'intérieur de la fonction soit disponible à l'extérieur de la fonction? Pourquoi ne pas retourner les résultats de la variable à l'intérieur de la fonction?
var x = function returnX { var x = 0; return x; }
est l'idée ...Je n'ai pas testé cela, mais si votre code a fonctionné avant ce petit changement, alors cela devrait fonctionner.
la source
Voici un exemple de code qui peut être utile.
Ici, j'ai trouvé une bonne réponse Comment-peut-on-déclarer-une-variable-globale-en-JavaScript
la source
Voici une autre méthode simple pour rendre la variable disponible dans d'autres fonctions sans avoir à utiliser de variables globales:
la source
si vous créez une fonction de démarrage, vous pouvez définir des fonctions et des variables globales de la manière suivante:
Étant donné que la fonction est invoquée globalement avec cet argument, il s'agit de la portée globale ici. Donc, quelque chose devrait être une chose globale.
la source
this
estundefined
en mode strict en dehors d'une fonction et ne doit pas être utilisé pour faire référence à l'objet global.