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.