Definiowanie zmiennej globalnej w funkcji JavaScript

Czy można zdefiniować zmienną globalną w funkcji JavaScript?

Chcę użyć zmiennej trailimage (zadeklarowanej w funkcji makeObj) w innych funkcjach.

<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>
Author: Peter Mortensen, 2011-04-26

14 answers

Jak powiedzieli inni, możesz użyć var w globalnym zasięgu (poza wszystkimi funkcjami i modułami), aby zadeklarować zmienną globalną:

<script>
var yourGlobalVariable;
function foo() {
    // ...
}
</script>

(zauważ, że to prawda tylko w globalnym zakresie. Gdyby ten kod był w module - <script type="module">...</script> - nie znajdowałby się w zasięgu globalnym, więc nie tworzyłby globalnego.)

Alternatywnie:

W nowoczesnych środowiskach można przypisać do Właściwości obiektu, który globalThis odnosi się do (globalThis Dodano w "ES2020"): {]}

<script>
function foo() {
    globalThis.yourGlobalVariable = ...;
}
</script>

W przeglądarkach można zrobić to samo z globalnym o nazwie window:

<script>
function foo() {
    window.yourGlobalVariable = ...;
}
</script>

...ponieważ w przeglądarkach wszystkie zmienne globalne zmienne globalne zadeklarowane przez var są właściwościami obiektu window. (W najnowszej specyfikacji, ECMAScript 2015, Nowy let, const, i class Oświadczenia o zasięgu globalnym tworzą globale, które nie są właściwościami obiektu globalnego; nowa koncepcja w ES2015.)

(jest też horror implicit globals , ale nie rób tego celowo i staraj się uniknąć tego przypadkowo, być może używając ES5 "use strict".)

Wszystko, co powiedzial: uniknalbym zmiennych globalnych, jesli mozna (i prawie na pewno mozna). Jak wspomniałem, kończą się one właściwościami window, a window jest już dość tłoczno co ze wszystkimi elementami z id (i wieloma z name) są wrzucane do niego (i niezależnie od nadchodzącej specyfikacji, IE wyrzuca tylko o wszystkim z name tam).

Zamiast tego, w nowoczesnych środowiskach, użyj modułów:

<script type="module">
let yourVariable = 42;
// ...
</script>

Kod najwyższego poziomu w module znajduje się w module scope, a nie global scope, więc tworzy zmienną, którą cały kod w tym module może zobaczyć, ale która nie jest globalna.

W przestarzałych środowiskach bez obsługi modułów, zawiń kod w funkcję zakresową i używaj zmiennych lokalnych do tej funkcji zakresowej, a inne funkcje w niej zamykaj:

<script>
(function() { // Begin scoping function
    var yourGlobalVariable; // Global to your code, invisible outside the scoping function
    function foo() {
        // ...
    }
})();         // End scoping function
</script>
 792
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-27 14:58:40

Jeśli czytasz Komentarze, to jest miła dyskusja wokół tej konkretnej konwencji nazewnictwa.

Wygląda na to, że odkąd moja odpowiedź została opublikowana, konwencja nazewnictwa stała się bardziej formalna. Ludzi, którzy uczą, piszą książki itp. mów o var deklaracji i function deklaracji.

Oto dodatkowy Post Wikipedii, który wspiera mój punkt: deklaracje i definicje ...i odpowiedzieć na główne pytanie. Zadeklaruj zmienną przed funkcją. To będzie praca i będzie zgodna z dobrą praktyką deklarowania zmiennych na górze zakresu:)

 21
Author: op1ekun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-06 21:50:28

Just declare

var trialImage;
Na Zewnątrz. Then
function makeObj(address) {
    trialImage = [address, 50, 50];
    ...
    ...
}
 19
Author: harihb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-06 21:41:11

Nie, Nie możesz. po prostu zadeklaruj zmienną poza funkcją. Nie musisz deklarować go w tym samym czasie, gdy przypisujesz wartość:

var trailimage;

function makeObj(address) {
  trailimage = [address, 50, 50];
 12
Author: Guffa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-29 07:58:35

Po prostu zadeklaruj to poza funkcjami i przypisz wartości wewnątrz funkcji. Coś w stylu:

<script type="text/javascript">
    var offsetfrommouse = [10, -20];
    var displayduration = 0;
    var obj_selected = 0;
    var trailimage = null ;  // Global variable
    function makeObj(address) {
        trailimage = [address, 50, 50];  // Assign value

Lub po prostu usunięcie " var " z nazwy zmiennej wewnątrz funkcji również czyni ją globalną, ale lepiej jest zadeklarować ją raz na zewnątrz dla czystszego kodu. To również zadziała:

var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;

function makeObj(address) {
    trailimage = [address, 50, 50];  // Global variable, assign value

Mam nadzieję, że ten przykład wyjaśnia więcej: 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);
 12
Author: DhruvPathak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-06 21:40:19

To bardzo proste. Zdefiniuj zmienną trailimage poza funkcją i ustaw jej wartość w funkcji makeObj . Teraz możesz uzyskać dostęp do jego wartości z dowolnego miejsca.

var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
var trailimage;

function makeObj(address) {
    trailimage = [address, 50, 50];
    ...
}
 4
Author: Bharath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-06 21:43:11
    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 - it's 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;

Zdaję sobie sprawę, że jest w tym prawdopodobnie wiele błędów składniowych, ale to ogólna idea... Wielkie dzięki LayZee za wskazanie tego... Możesz dowiedzieć się, co to jest magazyn lokalny i sesyjny w http://www.w3schools.com/html/html5_webstorage.asp. potrzebowałem tego samego do mojego kodu i to był naprawdę dobry pomysł.

 3
Author: ShanerM13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-06 22:03:03

Klasyczny przykład:

window.foo = 'bar';

Nowoczesny, bezpieczny przykład podążający za najlepszą praktyką za pomocą IIFE :

;(function (root) {
    'use strict'

    root.foo = 'bar';
)(this));

Obecnie istnieje również opcja użycia WebStorage API :

localStorage.foo = 42;

Lub

sessionStorage.bar = 21;

Pod względem wydajności, nie jestem pewien, czy jest to zauważalnie wolniejsze niż przechowywanie wartości w zmiennych.

Powszechne wsparcie dla przeglądarek, jak podano na mogę użyć....

 1
Author: Lars Gyrup Brink Nielsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-06 21:56:24

Istnieją trzy rodzaje zakresu w JavaScript:

  • Global Scoop: gdzie zmienna jest dostępna za pomocą kodu.
  • Block Scoop: gdzie zmienna jest dostępna wewnątrz pewnego obszaru jak funkcja.
  • local Scoop: gdzie zmienna jest dostępna w bardziej określonych obszarach, np. if - twierdzenie

Jeśli dodasz Var przed nazwą zmiennej, to jej miarka jest określana gdzie jej położenie is


Przykład:

var num1 = 18; // Global scope
function fun() {
  var num2 = 20; // Local (Function) Scope
  if (true) {
    var num3 = 22; // Block Scope (within an if-statement)
  }
}

num1 = 18; // Global scope
function fun() {
  num2 = 20; // Global Scope
  if (true) {
    num3 = 22; // Global Scope
  }
}
 1
Author: Tahseen Alaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-06 22:15:26

Jeśli chcesz, aby zmienna wewnątrz funkcji była dostępna poza funkcją, zwróć wyniki zmiennej wewnątrz funkcji.

var x = function returnX { var x = 0; return x; } taki jest pomysł...

    <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;
            return trailimage;
        }

        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>

Nie testowałem tego, ale jeśli twój kod działał przed tą małą zmianą, to powinien działać.

 0
Author: ShanerM13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-06 22:10:13

Używanie obiektu window nie jest dobrym pomysłem. Jak widzę w komentarzach,

'use strict';

function showMessage() {
    window.say_hello = 'hello!';
}

console.log(say_hello);

Spowoduje to błąd podczas używania zmiennej say_hello, którą musimy najpierw wywołać showMessage function.

 0
Author: Mamé,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-06 22:11:37

Oto kolejna prosta metoda udostępnienia zmiennej w innych funkcjach bez konieczności używania zmiennych globalnych:

function makeObj() {
  // var trailimage = 'test';
  makeObj.trailimage = 'test';
}
function someOtherFunction() {
  document.write(makeObj.trailimage);
}

makeObj();
someOtherFunction();
 -1
Author: am2124429,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-26 15:14:20

Oto przykładowy kod, który może być pomocny.

var Human = function() {
    name = "Shohanur Rahaman";  // Global variable
    this.name = "Tuly"; // Constructor variable 
    var age = 21;
};

var shohan = new Human();

document.write(shohan.name + "<br>");
document.write(name);
document.write(age); // Undefined because it's a local variable 

Tutaj znalazłem ładną odpowiedź: Jak Można zadeklarować zmienną globalną w JavaScript?

 -1
Author: Shohanur Rahaman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-06 22:07:18

Jeśli tworzysz funkcję startową, możesz zdefiniować globalne funkcje i zmienne w ten sposób:

function(globalScope)
{
    // Define something
    globalScope.something()
    {
        alert("It works");
    };
}(window)

Ponieważ funkcja jest wywoływana globalnie z tym argumentem, jest to zakres globalny. Więc coś powinno być czymś globalnym.

 -2
Author: Konstantin Isaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-06 21:44:26