Respostas:
Se você precisar gerar variáveis globais no código de produção (o que deve ser evitado), sempre as declare explicitamente :
window.globalVar = "This is global!";
Embora seja possível definir uma variável global apenas omitindo var
(supondo que não haja variável local com o mesmo nome), isso gera uma global implícita , o que é uma coisa ruim a ser feita e geraria um erro no modo estrito .
Se este é o único aplicativo em que você usará essa variável, a abordagem de Felix é excelente. No entanto, se você estiver escrevendo um plug-in jQuery, considere variáveis e funções de "namespacing" (detalhes das aspas mais tarde ...) necessárias no objeto jQuery. Por exemplo, atualmente estou trabalhando em um menu pop-up do jQuery que chamei de miniMenu. Assim, eu defini um "namespace" miniMenu
no jQuery e coloco tudo lá.
O motivo pelo qual uso aspas quando falo sobre espaços para nome javascript é que eles não são realmente espaços para nome no sentido normal. Em vez disso, basta usar um objeto javascript e colocar todas as minhas funções e variáveis como propriedades desse objeto.
Além disso, por conveniência, geralmente subpovoo o espaço de nomes do plug-in com um i
espaço de nomes para itens que só devem ser usados internamente dentro do plug-in, para ocultá-lo dos usuários do plug-in.
É assim que funciona:
// An object to define utility functions and global variables on:
$.miniMenu = new Object();
// An object to define internal stuff for the plugin:
$.miniMenu.i = new Object();
Agora posso fazer $.miniMenu.i.globalVar = 3
ou $.miniMenu.i.parseSomeStuff = function(...) {...}
sempre que precisar salvar algo globalmente e ainda assim mantê-lo fora do namespace global.
delete $.miniMenu
:). Tudo bem?
delete $.miniMenu
.
EDIT A pergunta é sobre JavaScript, a resposta é sobre jQuery, o que está errado. Esta é uma resposta antiga, desde os tempos em que o jQuery era difundido.
Em vez disso, recomendo a compreensão de escopos e fechamentos em JavaScript
Resposta antiga e ruim: Com o jQuery, você pode fazer isso, independentemente da declaração:
$my_global_var = 'my value';
E estará disponível em qualquer lugar. Eu o uso para fazer galerias de imagens rápidas, quando as imagens são espalhadas em lugares diferentes, como:
$gallery = $('img');
$current = 0;
$gallery.each(function(i,v){
// preload images
(new Image()).src = v;
});
$('div').eq(0).append('<a style="display:inline-block" class="prev">prev</a> <div id="gallery"></div> <a style="display:inline-block" class="next">next</a>');
$('.next').click(function(){
$current = ( $current == $gallery.length - 1 ) ? 0 : $current + 1;
$('#gallery').hide().html($gallery[$current]).fadeIn();
});
$('.prev').click(function(){
$current = ( $current == 0 ) ? $gallery.length - 1 : $current - 1;
$('#gallery').hide().html($gallery[$current]).fadeIn();
});
Dica : execute esse código inteiro no console nesta página ;-)
$current = 0;
no início a função, a posterior não funcionará.
Aqui está um exemplo básico de uma variável global que o restante de suas funções pode acessar. Aqui está um exemplo ao vivo para você: http://jsfiddle.net/fxCE9/
var myVariable = 'Hello';
alert('value: ' + myVariable);
myFunction1();
alert('value: ' + myVariable);
myFunction2();
alert('value: ' + myVariable);
function myFunction1() {
myVariable = 'Hello 1';
}
function myFunction2() {
myVariable = 'Hello 2';
}
Se você estiver fazendo isso dentro de uma função jquery ready (), verifique se sua variável está dentro da função ready () junto com suas outras funções.
Declare a variável fora das funções
function dosomething(){
var i = 0; // can only be used inside function
}
var i = '';
function dosomething(){
i = 0; // can be used inside and outside the function
}
A melhor maneira é usar closures
, porque o window
objeto fica muito, muito cheio de propriedades.
Html
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="init.js"></script>
<script type="text/javascript">
MYLIBRARY.init(["firstValue", 2, "thirdValue"]);
</script>
<script src="script.js"></script>
</head>
<body>
<h1>Hello !</h1>
</body>
</html>
init.js (com base nesta resposta )
var MYLIBRARY = MYLIBRARY || (function(){
var _args = {}; // private
return {
init : function(Args) {
_args = Args;
// some other initialising
},
helloWorld : function(i) {
return _args[i];
}
};
}());
script.js
// Here you can use the values defined in the html as if it were a global variable
var a = "Hello World " + MYLIBRARY.helloWorld(2);
alert(a);
Aqui está o plnkr . Espero que ajude!
window
está disponível apenas em navegadores. Você poderia editar sua resposta para fazê-la funcionar em todos os ambientes? Consulte Como obter o objeto global em JavaScript?