É possível definir uma variável global em uma função JavaScript?
Eu quero usar a trailimage
variável (declarada na makeObj
função) em outras funções.
<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
não declara uma variável global. Uma conseqüência da atribuição de um valor a uma variável não declarada é a criação de uma propriedade no objeto global, que é bem diferente de declarar uma variável.Respostas:
Sim, como os outros disseram, você pode usar
var
no escopo global (fora de todas as funções) para declarar uma variável global:Como alternativa, você pode atribuir a uma propriedade em
window
:... porque nos navegadores,
todas as variáveisglobais variáveis globais declaradas comvar
são propriedades dowindow
objeto. (Na última especificação, ECMAScript 2015, o novolet
,const
, eclass
declarações no escopo global criar globals que não são propriedades do objeto global; um novo conceito em ES2015.)(Há também o horror de globais implícitos , mas não faça isso de propósito e faça o possível para evitar fazê-lo por acidente, talvez usando os ES5s
"use strict"
.)Tudo isso dito: eu evitaria variáveis globais se você puder (e você quase certamente pode). Como eu mencionei, eles acabam sendo propriedades de
window
, ewindow
já estão bastante cheios, com todos os elementos com umid
(e muitos com apenas umname
) sendo despejados (e independentemente da especificação futura, o IE despeja praticamente qualquer coisa com umname
lá) )Em vez disso, envolva seu código em uma função de escopo e use variáveis locais para essa função de escopo, e faça com que suas outras funções sejam fechadas nela:
fonte
window
não funcionará no Node. O truque mais fácil aqui é definir:GLOBAL.window = GLOBAL;
- conforme explicado nesta pergunta relacionada . Claro, não é bonito conceitualmente. Eu prefiro fazer as coisas ao contrário, para que eu possa usar emGLOBAL
vez dewindow
.window.yourGlobalVariable = ...;
funciona como um encanto depois de ler 5 a 6 perguntas no site da pilha.eval
lá. Em vez disso:window[dynamic_variable_name] = dynamic_variable_value;
ATUALIZAÇÃO1: Se você ler os comentários, haverá uma boa discussão sobre esta convenção de nomenclatura específica.
ATUALIZAÇÃO2: Parece que desde que minha resposta foi publicada, a convenção de nomes ficou mais formal. As pessoas que ensinam, escrevem livros etc. falam sobre
var
declaração efunction
declaração.ATUALIZAÇÃO3: Aqui está o post adicional da wikipedia que suporta meu argumento: http://en.wikipedia.org/wiki/Declaration_(computer_programming)#Declarations_and_Definitions
... e para responder à pergunta principal. DECLARE antes da sua função. Isso funcionará e seguirá as boas práticas de declarar suas variáveis no topo do escopo :)
fonte
definition
edeclaration
significa em C. Sua primeira linha pode ser uma declaração ou uma definição (dependendo de onde estiver); o segundo é apenas uma tarefa. Uma declaração apenas especifica a interpretação do identificador (ou seja,myVar
é umint
); se a declaração também reserva armazenamento, é adefinition
. Isso não está relacionado à digitação; é parte de como as unidades de compilação entendem referências a outras unidades de compilação.var myVar
é chamado de declaração (não precisa ser digitado) emyVar = 10
uma atribuição . Eu ouvi o termo "definição" para o composto (var myVar = 10;
).Apenas declare
lado de fora. Então
Espero que isto ajude.
fonte
Não, você não pode. Apenas declare a variável fora da função. Você não precisa declarar isso ao mesmo tempo em que atribui o valor:
fonte
window
são sinônimos. De qualquer maneira, a distinção semântica que você está fazendo é clara, então não me importo de não fazer voto negativo. Edit: incapaz de alterar meu voto, desculpe!var
, que é o que Guffa quis dizer com criar implicitamente (como @DhruvPathak também apontou).Apenas declare-o fora das funções e atribua valores dentro das funções. Algo como:
Ou simplesmente remover "var" do nome da variável dentro da função também a torna global, mas é melhor declará-la fora uma vez para obter um código mais limpo. Isso também funcionará:
Espero que este exemplo explique mais: http://jsfiddle.net/qCrGE/
fonte
É muito simples definir a variável trailimage fora da função e definir seu valor na função makeObj. Agora você pode acessar seu valor de qualquer lugar.
fonte
Percebo que provavelmente há muitos erros de sintaxe nisso, mas é a idéia geral ... Muito obrigado LayZee por apontar isso ... Você pode encontrar o que é um armazenamento local e de sessão em http: //www.w3schools. com / html / html5_webstorage.asp . Eu precisava da mesma coisa para o meu código e essa foi uma ótima ideia.
fonte
location.reload(false);
atualizá-la repetidamente.Exemplo clássico:
Exemplo moderno e seguro, seguindo as melhores práticas usando um IIFE :
Atualmente, também há a opção de usar a API WebStorage
ou
Em termos de desempenho, não tenho certeza se é visivelmente mais lento que o armazenamento de valores em variáveis.
Suporte amplo ao navegador, conforme indicado em Posso usar ...
fonte
localStorage.foo = JSON.stringify({ arbitrary: 'object', meaning: 42, awesome: true });
evar foo = JSON.decode(localStorage.foo);
.localStorage
tem a ver com variáveis globais?Então você quer a variável dentro da função disponível fora da função? Por que não retornar os resultados da variável dentro da função?
var x = function returnX { var x = 0; return x; }
é a ideia ...Não testei isso, mas se seu código funcionou antes dessa pequena alteração, ele deve funcionar.
fonte
Aqui está um código de exemplo que pode ser útil.
Aqui encontrei uma boa resposta Como posso declarar uma variável global em JavaScript
fonte
Aqui está outro método fácil para disponibilizar a variável em outras funções sem precisar usar variáveis globais:
fonte
se você estiver criando uma função de inicialização, poderá definir funções e variáveis globais da seguinte maneira:
Como a função é invocada globalmente com esse argumento, esse é o escopo global aqui. Então, o algo deve ser uma coisa global.
fonte
this
estáundefined
no modo estrito fora de uma função e não deve ser usado para se referir ao objeto global.