Reinventando JavaScript em JavaScript

por Walter Cruz on 02/08/2006
in Python, Lua, JavaScript, Linguagens, Ruby

Creio que todo mundo que se envolveu com desenvolvimento web já teve alguma dor de cabeça com JavaScript. Ou era um script que funcionava no Internet Explorer e não funcionava nos outros, ou um script que funcionava nos outros e não no Internet Explorer (o caso mais comum).

Nascida nas entranhas do Netscape, JavaScript já começa com uma propaganda enganosa: nada tem a ver com Java. Exceto, talvez, por herdarem a sintaxe do C e C++. Porém, semanticamente, JavaScript está muito mais próxima de Self , uma linguagem baseada no conceito de protótipo.

Mas seu maior problema é a falta de padronização das implementações dos navegadores. Usar o W3 DOM resolve muita coisa, mas existem bugs e chatices que a gente descobre com o tempo. Você pode ter problemas com arredondamento de números de ponto flutuante (mas isso não é culpa do JavaScript). Gostaria de usar o appendChild em uma tabela no Internet Explorer? Você precisa do TBODY na tabela. Em muitos casos, o Internet Explorer implementa as mesmas funcionalidades do DOM com nome diferente, só pra complicar. Sendo justos: nem todas elas são do JavaScript. Algumas vezes o navegador implementa CSS de forma incorreta - e ficamos frustrados ao usar DOM para mexer com CSS (Essa combinação de DOM, com CSS e HTML recebeu o simpático nome de DHTML, que nos tempos de Ajax, está em alta). Aliás, usar DOM, já é uma frustração. Em Ruby, ReXML e em Python, CElementTree resolvem a parada de forma muito mais concisa.

Porém, eu gosto de JavaScript. Com ela eu senti pela primeira vez o gosto de objetos de primeira classe funções anônimas, e closures. Num certo sentido, ela me preparou muito mais para Lua do que PHP.

O fato dela suportar objetos de primeira classe e closures, leva a alguns pontos interessantíssimos. Hoje, existem uma diversidade de bibliotecas para se trabalhar com JavaScript. A maioria dela foi escrita por programadores com fluência em outra linguagem. A maioria deles optou por deixar JavaScript mais parecida com a sua linguagem favorita.

Alguns exemplos, da biblioteca Prototype:


//Prototype (JavaScript / Ruby)
// alert "1", "2", "3" ... "50"
50.times(function(n) {
 alert(n);  
}};

// alerts "a is at 0" then "b is at 1" then "c is at 2"
["a", "b", "c"].each(function(item, index) {
 alert(item + " is at " + index);
});


// adicionaEnumerable aos nós filhos da div
var children = $A($("mydiv").childNodes);

// muda a classe para "highlighted" para todos os nós filhos
// de "mydiv"
children.each(function(child) {
 child.setAttribute("class", "highlighted");
});
 

Além dela, existe o MochiKit, desenvolvido por Bob Ippolito, que implementa algumas coisas de python na sua biblioteca. Por exemplo, o MochiKit.Async é inspirado no twisted, e o MochiKit.Iter é inspirado no módulo itertools do python.


var d = getElementsByTagAndClassName('DIV', 'draggable');
    forEach(d,
        function(elem) {
            connect(elem, 'onmousedown', Drag.start);
        });

//função map

var arrayOne = [1, 2, 3, 4, 5];
var arrayTwo = [1, 5, 2, 4, 3];
var arrayThree = [5, 2, 1, 3, 4];
var biggestElements = map(objMax, arrayOne, arrayTwo, arrayThree);
assert( objEqual(biggestElements, [5, 5, 3, 4, 5]) );
 

Existem além dessas bibliotecas outras, que fazem JavaScript ser mais parecido com Java, por exemplo.

Apesar de todas as desvantagens de JavaScript, não tem como fugir dele - é a única alternativa 100% suportada para programação client-side na web. E como ele suporta closures, funções de primeira classe e funções anônimas, é razoavelmente fácil torná-lo mais fácil de digerir. Poucas linguagens são estensíveis dessa maneira.

(Brendan Eich está preparando algumas coisas mais pythônicas para as próximas versões de JavaScript. Veja mais em: http://weblogs.mozillazine.org/roadmap/archives/2006/02/js_and_python_news.html )

Endereço de trackback para este post

Trackback URL (clique direito e copie atalho/localização do link)

Sem feedback para esse post ainda

    Share Your Thoughts


    Seu endereço de e-mail não será revelado nesse site.

    Sua URL será exibida.
    PobreExcelente
    (Quebras de linha se tornam <br />)
    (Nome, e-mail & website)
    (Permitir que usuários o contatem através de um formulário eletrônico (seu e-mail não será exibido.))
    Subscribe to comments by email

    You can just use your OpenID to provide your name, e-mail and url.