03/10
2011
Abaixo um código para faciliar o uso de intervals e minimizar o uso de variáveis globais:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| var interval = (function(){
var ids = {}, names = {};
return {
add: function(name, timer, fn) {
var interval = setInterval(fn, timer);
ids[interval] = name;
names[name] = interval;
},
stop: function(name) {
clearInterval(names[name]);
}
}
})(); |
A utilização aconteceria mais ou menos assim:
1
2
3
4
5
6
| function coisas_legais() {
alert('Função legal');
}
interval.add('invervalo_legal', 300, coisas_legais); |
Para parar a execução deste intervalo:
1
| interval.stop('intervalo_legal') |
22/06
2011
Um padrão recorrente na programação em jQuery é executar uma função quando um link é clicado e, concomitantemente, evitar o que navegador carrege uma nova página ao ser clicado. É possível criar uma função que sirva de atalho para esta tarefa repetitiva:
1
2
3
4
5
6
| $.fn.extend({clickPrevented: function(fn) {
$(this).click(function(e) {
e.preventDefault();
fn(e);
});
}}); |
A utilização aconteceria mais ou menos assim:
1
2
3
| $('#apenas_um_cara').clickPrevented(function(){
alert('Você vai continuar nesta página após o alert.');
}); |
17/06
2011
É comum a necessidade de converter strings para inteiros. Por exemplo: se você obtiver um valor de um campo input, e precisar fazer alguma conta ou validação com esse valor é prudente converter primeiro para um número. A função que deve ser utilizada para isso chama-se parseInt.
1
2
| var valor = '020';
alert(parseInt(valor, 10)); |
Pra que serve o segundo parâmetro?
Esta função tem uma “funcionalidade” complicada. Se a string começar com “0″ ela vai ser convertida utilizando base 8 (sistema octal) ao invés de base 10. O segundo argumento determina qual base numérica deve ser utilizada. A string 20 seria convertida para o número octal 16. Veja o que acontece quando omitimos o segundo parâmetro:
1
2
| var valor = '020';
alert(parseInt(valor)); |
É, portanto, boa prática sempre utilizar o segundo argumento para evitar qualquer transtorno. Ou, se você quiser treinar funções anônimas, a seguinte brincadeira também é possível:
1
2
3
4
5
6
7
8
9
10
| (function(){
var original = parseInt;
parseInt = function(n, b) {
b = b || 10;
return original(n, b);
};
})();
var valor = '020';
alert(parseInt(valor)); |
Esse fragmento de código só precisa ser executado uma vez (no seu init.js, por exemplo). Repare que se você rodar o exemplo 2 novamente, o resultado já será o correto. O que fizemos foi reescrever a função parseInt usando ela mesma.
07/04
2011
Ah, o Internet Explorer. O que dizer de bom desse nosso querido amiguinho? Tem ele razão em algo? Sim, tem. Vamos declarar um objeto:
var bruceLee = {
forca: 8,
agilidade: 10,
defesa: 7, // esta vírgula está sobrando
};
Muito bem. O problema do objeto é uma vírgula sobrando logo depois do número sete. O único navegador que reclama do erro de sintaxe, e pára a execução do script é o Internet Explorer. Já perdi horas e mais horas tentando encontrar uma solução para perceber que na verdade era uma vírgula que eu havia esquecido de apagar.
03/04
2010
Funções em JavaScript podem ser passadas como argumentos de outras funções. Esta prática é inclusive muito explorada pelos programadores. Se você ainda não esta familiarizado com o uso de funções, leia este post primeiro. Vamos então aos exemplos.
Funções como argumentos
1
2
3
4
5
6
7
8
9
10
| function imprimir(fn) {
var texto = fn();
alert(texto);
}
function gerador() {
return 'Sou um texto!';
}
imprimir(gerador); |
Neste primeiro exemplo, declaramos uma função chamada “imprimir” que espera como argumento uma outra função. Ela executa esta outra função, pega o seu retorno e passa ele como argumento de “alert”.
É importante perceber que na linha 10 “gerador” é passado como argumento sem os parênteses “()” no final. Ou seja, ela não está sendo invocada, somente passada. A execução da função ocorre na linha 2. Uma variação do nosso exemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
| function imprimir(fn) {
var texto = fn('por');
alert(texto);
}
function gerador(lingua) {
if (lingua === 'por') {
return 'Sou um texto!';
}
return 'I´m a text!';
}
imprimir(gerador); |
Agora “gerador” espera um parâmetro “lingua”. Este parâmetro é passado por “imprimir” no ato da execução, linha 2.
Funções anônimas
O nome pode parecer estranho mas o conceito é bem simples: funções anônimas são funções que não tem nome:
1
2
3
4
5
6
7
8
9
10
11
| function imprimir(fn) {
var texto = fn('por');
alert(texto);
}
imprimir(function(lingua) {
if (lingua === 'por') {
return 'Sou um texto!';
}
return 'I´m a text!';
}); |
“Imprimir” continua sendo exatamente igual. Aguarda uma função como parâmetro. A diferença é que, ao invocarmos “imprimir”, declaramos uma função anônima ao mesmo tempo. Como ela não tem nome, não existe a possibilidade dela ser executada por uma outra função ou em outro momento do código. Somente “imprimir” a contém e pode executá-la.
E pra quê serve isso?
Funções como argumentos e funções anônimas são amplamente utilizadas como “callbacks”. Se você atrela um evento de click a um botão, algo deve acontecer quando este botão for clicado. Este “algo” é uma função. Ou então uma requisição Ajax. Vamos supor que temos uma requisição que busca se um determinado email já foi ou não cadastrado em um banco de dados. Quando a requisição finalmente termina, uma resposta é enviada ao nosso programa. Esta resposta é normalmente passada como argumento de uma função “callback”.