Можно ли определить глобальную переменную в функции JavaScript?
Я хочу использовать trailimage
переменную (объявленную в makeObj
функции) в других функциях.
<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
не объявляет глобальную переменную. Следствием присвоения значения необъявленной переменной является создание свойства в глобальном объекте, которое сильно отличается от объявления переменной.Ответы:
Да, как уже говорили другие, вы можете использовать
var
в глобальной области видимости (вне всех функций) для объявления глобальной переменной:Кроме того, вы можете назначить свойство на
window
:... потому что в браузерах
все глобальныепеременные, объявленные с помощью глобальных переменных,var
являются свойствамиwindow
объекта. (В последней спецификации ECMAScript 2015, новыйlet
,const
иclass
заявление в глобальном масштабе создать глобал, которые не являются свойством глобального объекта, новая концепцию в ES2015.)(Существует также ужас неявных глобальных переменных , но не делайте это нарочно и делайте все возможное, чтобы избежать этого случайно, возможно, с помощью ES5
"use strict"
.)Все это говорит: я бы избежал глобальных переменных, если вы можете (и вы почти наверняка можете). Как я уже говорил, они в конечном итоге являются свойствами
window
, иwindow
уже достаточно многолюдны, что со всеми элементами сid
(и многими с просто aname
), сбрасываемыми в него (и независимо от этой будущей спецификации, IE сбрасывает практически все, что находитсяname
там). ).Вместо этого, оберните ваш код в функцию области видимости и используйте переменные, локальные для этой функции области видимости, и сделайте ваши другие функции замыканиями внутри нее:
источник
window
не будет работать в Node. Самый простой трюк здесь - установить:GLOBAL.window = GLOBAL;
- как объяснено в этом связанном вопросе . Конечно, это не очень концептуально. Я предпочитаю делать вещи наоборот, поэтому я могу использоватьGLOBAL
вместоwindow
.window.yourGlobalVariable = ...;
работает как очарование после прочтения 5-6 вопросов на сайте стека.eval
там. Вместо этого:window[dynamic_variable_name] = dynamic_variable_value;
ОБНОВЛЕНИЕ 1: Если вы читаете комментарии, есть хорошая дискуссия вокруг этого конкретного соглашения об именах.
ОБНОВЛЕНИЕ 2: Кажется, что с тех пор, как мой ответ был опубликован, соглашение об именах стало более формальным. Люди, которые учат, пишут книги и т. Д. Говорят о
var
декларации, иfunction
декларации.ОБНОВЛЕНИЕ 3: Вот дополнительный пост Википедии, который поддерживает мою точку зрения: http://en.wikipedia.org/wiki/Declaration_(computer_programming)#Declarations_and_Definitions
... и ответить на главный вопрос. ОБЪЯВЛЯЙТЕ переменную перед вашей функцией. Это будет работать, и это будет соответствовать хорошей практике объявления ваших переменных в верхней части области видимости :)
источник
definition
иdeclaration
означает в C. Ваша первая строка может быть либо объявлением, либо определением (в зависимости от того, где оно находится); второе - просто задание. Объявление просто определяет интерпретацию идентификатора (то есть.myVar
Являетсяint
); если декларация также резервирует хранилище, этоdefinition
. Это не связано с набором текста; это часть того, как единицы компиляции понимают ссылки на другие единицы компиляции.var myVar
называется декларацией (она не должна быть набрана) и назначение . Я слышал термин "определение" для соединения ( ).myVar = 10
var myVar = 10;
Просто объявить
снаружи. затем
Надеюсь это поможет.
источник
Нет, ты не можешь. Просто объявите переменную вне функции. Вам не нужно объявлять его одновременно с назначением значения:
источник
window
являются синонимами. В любом случае, семантическое различие, которое вы проводите, очевидно, поэтому я не возражаю против отказа от голосования. Изменить: не могу изменить свой голос, извините!var
, что Guffa подразумевал под неявным созданием (например, там указывал @DhruvPathak).Просто объявите это вне функций и присвойте значения внутри функций. Что-то вроде:
Или простое удаление «var» из имени вашей переменной внутри функции также делает его глобальным, но лучше объявить его снаружи один раз для более чистого кода. Это также будет работать:
Я надеюсь, что этот пример объясняет больше: http://jsfiddle.net/qCrGE/
источник
Очень просто определить переменную trailimage вне функции и установить ее значение в функции makeObj. Теперь вы можете получить доступ к его стоимости из любого места.
источник
Я понимаю, что в этом, вероятно, много синтаксических ошибок, но это общая идея ... Большое спасибо LayZee за то, что указал на это ... Вы можете найти локальное и сессионное хранилище на http: //www.w3schools. com / html / html5_webstorage.asp . Мне нужно то же самое для моего кода, и это была действительно хорошая идея.
источник
location.reload(false);
многократного обновления страницы.Классический пример:
Современный, безопасный пример, основанный на передовом опыте использования IIFE :
В настоящее время есть также возможность использования API WebStorage
или
Производительность, я не уверен, что это заметно медленнее, чем сохранение значений в переменных.
Широкая поддержка браузеров, как указано на Могу ли я использовать ...
источник
localStorage.foo = JSON.stringify({ arbitrary: 'object', meaning: 42, awesome: true });
иvar foo = JSON.decode(localStorage.foo);
.localStorage
общего с глобальными переменными?Итак, вы хотите, чтобы переменная внутри функции была доступна вне функции? Почему бы не вернуть результаты переменной внутри функции?
var x = function returnX { var x = 0; return x; }
это идея ...Я не проверял это, но если ваш код работал до этого небольшого изменения, то он должен работать.
источник
использовать
window
объект не очень хорошая идея. Как я вижу в комментарияхЭто вызовет ошибку при использовании переменной say_hello, которую мы должны сначала вызвать
showMessage function
.источник
Вот пример кода, который может быть полезен.
Здесь я нашел хороший ответ: как можно объявить глобальную переменную в JavaScript
источник
Вот еще один простой способ сделать переменную доступной в других функциях без использования глобальных переменных:
источник
если вы делаете функцию запуска, вы можете определить глобальные функции и переменные следующим образом:
Поскольку функция вызывается глобально с этим аргументом, здесь это глобальная область. Итак, что-то должно быть глобальным.
источник
this
находитсяundefined
в строгом режиме вне функции и не должен использоваться для ссылки на глобальный объект.