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>
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>
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:)
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];
...
...
}
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];
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);
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];
...
}
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ł.
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ć....
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
}
}
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ć.
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
.
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();
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?
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.
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