A partir dos documentos, eu entendo que .proxy()
isso mudaria o escopo da função passada como argumento. Alguém poderia me explicar isso melhor? Por que devemos fazer isso?
javascript
jquery
Aditya Shukla
fonte
fonte
Respostas:
O que ele faz é garantir que o valor de
this
em uma função seja o valor que você deseja.Um exemplo comum é
setTimeout
aquele que ocorre dentro de umclick
manipulador.Pegue isso:
A intenção é bastante simples. Quando
myElement
é clicado, ele deve receber a turmaaNewClass
. Dentro do manipuladorthis
representa o elemento que foi clicado.Mas e se quiséssemos um pequeno atraso antes de adicionar a classe? Podemos usar a
setTimeout
para realizá-lo, mas o problema é que, independentemente da função que atribuímossetTimeout
, o valor dethis
dentro dessa função será emwindow
vez de nosso elemento.Portanto, o que podemos fazer é chamar
$.proxy()
, enviando a função e o valor que queremos atribuirthis
, e ele retornará uma função que reterá esse valor.Então, depois de atribuirmos
$.proxy()
a função e o valor que desejamosthis
, ele retornou uma função que garantirá quethis
seja definida corretamente.Como isso acontece? Ele apenas retorna uma função anônima que chama nossa função usando o
.apply()
método, que permite definir explicitamente o valor dethis
.Uma visão simplificada da função retornada pode parecer com:
Portanto, essa função anônima é atribuída
setTimeout
e tudo o que faz é executar nossa função original com othis
contexto apropriado .fonte
$.proxy(function () {...}, this)
vez de(function() {...}).call(this)
? Existe alguma diferença?.call
você está chamando a função imediatamente. Com$.proxy
, é comoFunction.prototype.bind
onde ele retorna uma nova função. Essa nova função tem othis
valor permanentemente vinculado, de modo que, quando é passadosetTimeout
esetTimeout
chama a função posteriormente, ainda terá othis
valor correto .Sem entrar em maiores detalhes (o que seria necessário porque se trata de Contexto no ECMAScript, a variável this context etc.)
Existem três tipos diferentes de "contextos" no ECMA- / Javascript:
Todo código é executado em seu contexto de execução . Existe um contexto global e pode haver muitas instâncias de contextos de função (e avaliação). Agora a parte interessante:
Toda chamada de uma função entra no contexto de execução da função. Um contexto de execução de uma função se parece com:
O
escopo do objeto de ativação encadeia
esse valor
Portanto, este valor é um objeto especial relacionado ao contexto de execução. Existem duas funções no ECMA- / Javascript que podem alterar esse valor em um contexto de execução de função:
Se tivermos uma função
foobar()
, podemos alterar esse valor chamando:Agora podemos acessar
foobar
o objeto que passamos:É exatamente
jQuery.proxy()
isso que faz. É preciso umfunction
econtext
(que é nada mais do que um objeto) e liga a função invocando.call()
ou.apply()
e retorna essa nova função.fonte
Eu escrevi esta função:
fonte
O mesmo objetivo pode ser alcançado usando a
função de execução automática"Expressão de função imediatamente chamada, curta: IIFE" :fonte