Function.bind()

Data de postagem: May 25, 2010 7:51:55 PM

Publicamos na DESENVOLVE o método bind() para Function. Esta função existe em alguns frameworks JS e foi incluída no ECMAScript 3.1, a nova versão do JavaScript.

A função bind() é excelente para resolver uma limitação da linguagem, que é a passagem de métodos (funções de objetos) para outros objetos. O JavaScript, diferente de outras linguagens, não "amarra" uma função ao objeto que a "definiu" e o this é decidido no momento da invocação. Em JS não existe o conceito forte de método, uma função de um objeto.

Exemplo:

var obj = {

data: 10,

test: function () {

return this.data

}

}

// Method invocation, this é o objeto que antecede o ponto.

obj.test() // retorna 10

// Function invocation, this é o objeto global

var f = obj.test

f() // retorna undefined, pois não existe uma variável global chamada data

var data = 20

f() // retorna 20, para demonstrar que this é o global

// Function invocation com bind

f = obj.test.bind( obj )

f() // retorna 10. Apesar de ser um function invocation, this será obj

Desta forma, o bind permite utilizar métodos de objetos como tratadores de eventos, como demonstrado abaixo:

var controlador = {

campoTesteRequerido: true,

validaBeforePost: function ( grid ){

if ( this.campoTesteRequerido && !grid.ds.teste ){

throw new Error( "O campo Teste deve ser preenchido." )

}

}

}

grid.onBeforePost.set( controlador.validaBeforePost ) // erro, pois this.campoTesteRequerido será undefined

grid.onBeforePost.set( controlador.validaBeforePost.bind( controlador ) ) // ok, this será controlador

Além de determinar o this de uma função, o bind permite pré-determinar os seus parâmetros iniciais. Exemplo:

function incrementa( qtd, valor ){

return qtd + valor

}

var inc10 = incrementa.bind( this, 10 )

inc10(100) // retorna 110

A função bind() torna desnecessário o uso da obscura classe Method, utilizado na declaração de alguns eventos.

Em breve a documentação de referência será atualizada.

As extensões de Function são realizadas em "-1898145852 /* /products/UNUMengine/library/extensions/Function.js */". Esta biblioteca também pode ser utilizada no cliente (browser). A biblioteca somente declara bind() se o interpretador JavaScript utilizado não a declarar nativamente.