È ansible definire una variabile globale in una funzione JavaScript?
Voglio usare la variabile trailimage
(dichiarata nella funzione makeObj
) in altre funzioni.
var offsetfrommouse = [10, -20]; var displayduration = 0; var obj_selected = 0; function makeObj(address) { **var trailimage = [address, 50, 50];** document.write('
'); 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); }
Sì, come hanno detto gli altri, è ansible utilizzare var
nell’ambito globale (al di fuori di tutte le funzioni) per dichiarare una variabile globale:
In alternativa, puoi assegnare a una proprietà sulla window
:
… perché nei browser, tutte le variabili globali le variabili globali dichiarate con var
sono proprietà dell’object window
. (Nelle specifiche più recenti, ECMAScript 2015, le nuove istruzioni let
, const
e class
all’ambito globale creano globals che non sono proprietà dell’object globale, un nuovo concetto in ES2015.)
(C’è anche l’orrore delle global implicite , ma non farlo apposta e fai del tuo meglio per evitare di farlo per sbaglio, magari usando "use strict"
ES5.)
Detto ciò: eviterei le variabili globali se ansible (e quasi certamente lo si può fare). Come ho già detto, finiscono per essere proprietà della window
, e la window
è già abbastanza affollata e con tutti gli elementi con un id
(e molti con solo un name
) che vengono scaricati (e indipendentemente dalle prossime specifiche, IE scarica qualsiasi cosa con un name
lì).
Invece, avvolgi il tuo codice in una funzione di scoping e usa le variabili locali per quella funzione di scoping e fai in modo che le altre funzioni si chiudano al suo interno:
UPDATE1: Se leggi i commenti c’è una bella discussione attorno a questa particolare convenzione di denominazione.
UPDATE2: Sembra che da quando la mia risposta è stata postata la convenzione di denominazione è diventata più formale. Le persone che insegnano, scrivono libri, ecc. Parlano della dichiarazione di var
e della dichiarazione di function
.
UPDATE3: Ecco il post aggiuntivo di Wikipedia che supporta il mio punto: http://en.wikipedia.org/wiki/Declaration_(computer_programming ) #Declarations_and_Definitions
… e rispondere alla domanda principale. DECLARE variabile prima della tua funzione. Questo funzionerà e rispetterà la buona pratica di dichiarare le tue variabili in cima allo scope 🙂
Basta dichiarare
var trialImage;
al di fuori. Poi
function makeObj(address) { trialImage = [address, 50, 50]; .. .. }
Spero che questo ti aiuti.
No, non puoi. Basta dichiarare la variabile al di fuori della funzione. Non devi dichiararlo nello stesso momento in cui assegni il valore:
var trailimage; function makeObj(address) { trailimage = [address, 50, 50];
Basta dichiararlo al di fuori delle funzioni e assegnare valori all’interno delle funzioni. Qualcosa di simile a:
O semplicemente rimuovere "var" dal nome della variabile all'interno della funzione lo rende anche globale, ma è meglio dichiararlo fuori una volta per un codice più pulito. Questo funzionerà anche:
var offsetfrommouse = [10, -20]; var displayduration = 0; var obj_selected = 0; function makeObj(address) { trailimage = [address, 50, 50]; //GLOBAL VARIABLE , ASSIGN VALUE
Spero che questo esempio spieghi di più: http://jsfiddle.net/qCrGE/
var globalOne = 3; testOne(); function testOne() { globalOne += 2; alert("globalOne is : " + globalOne ); globalOne += 1; } alert("outside globalOne is : " + globalOne); testTwo(); function testTwo() { globalTwo = 20; alert("globalTwo is " + globalTwo); globalTwo += 5; } alert("outside globalTwo is :" + globalTwo);
È molto semplice definire la variabile trailimage al di fuori della funzione e impostarne il valore nella funzione makeObj. Ora puoi accedere al suo valore da qualsiasi luogo.
var offsetfrommouse = [10, -20]; var displayduration = 0; var obj_selected = 0; var trailimage; function makeObj(address) { trailimage = [address, 50, 50]; .... }
var Global = 'Global'; function LocalToGlobalVariable() { //This creates a local variable. var Local = '5'; //Doing this makes the variable available for one session //(a page refresh - Its the session not local) sessionStorage.LocalToGlobalVar = Local; // It can be named anything as long as the sessionStorage references the local variable. // Otherwise it won't work //This refreshes the page to make the variable take effect instead of the last variable set. location.reload(false); }; //This calls the variable outside of the function for whatever use you want. sessionStorage.LocalToGlobalVar;
Mi rendo conto che probabilmente ci sono molti errori di syntax in questo, ma è un’idea generale … Grazie mille LayZee per averlo indicato … Puoi trovare quello che è un archivio locale e di sessione all’indirizzo http: //www.w3schools. it / html / html5_webstorage.asp . Ho avuto bisogno della stessa cosa per il mio codice e questa è stata davvero una buona idea.
Esempio classico:
window.foo = 'bar';
Esempio moderno e sicuro che segue le migliori pratiche utilizzando un IIFE :
;(function (root) { 'use strict' root.foo = 'bar'; )(this));
Al giorno d’oggi, c’è anche la possibilità di utilizzare l’ API WebStorage
localStorage.foo = 42;
o
sessionStorage.bar = 21;
In modo analogo, non sono sicuro se sia notevolmente più lento della memorizzazione di valori nelle variabili.
Supporto browser diffuso come indicato su Posso usare …
Ecco un codice di esempio che potrebbe essere helful.
var Human = function(){ name = "Shohanur Rahaman"; // global variable this.name = "Tuly"; // constructor variable var age = 21; }; var shohan = new Human(); document.write(shohan.name+"
"); document.write(name); document.write(age); // undefined cause its local variable
Qui ho trovato una bella risposta How-can-one-declare-a-global-variable-in-JavaScript
se stai facendo una funzione di avvio, puoi definire funzioni e variabili globali in questo modo:
function(globalScope) { //define something globalScope.something() { alert("It works"); }; }(window)
Poiché la funzione è invocata globalmente con questo argomento, questo è lo scopo globale qui. Quindi, il qualcosa dovrebbe essere una cosa globale.
Ecco un altro metodo semplice per rendere la variabile disponibile in altre funzioni senza dover utilizzare variabili globali:
function makeObj() { // var trailimage = 'test'; makeObj.trailimage = 'test'; } function someOtherFunction() { document.write(makeObj.trailimage); } makeObj(); someOtherFunction();