Definire la variabile globale in una funzione JavaScript

È 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();