Estou experimentando o ES6 há um tempo e acabei de encontrar um pequeno problema.
Eu realmente gosto de usar as funções de seta e sempre que posso, eu as uso.
No entanto, parece que você não pode vinculá-los!
Aqui está a função:
var f = () => console.log(this);
Aqui está o objeto ao qual quero vincular a função:
var o = {'a': 42};
E aqui está como eu me ligaria f
a o
:
var fBound = f.bind(o);
E então eu posso simplesmente ligar fBound
:
fBound();
O que produzirá este (o o
objeto):
{'a': 42}
Legal! Encantador! Exceto que isso não funciona. Em vez de emitir o o
objeto, ele gera o window
objeto.
Então, eu gostaria de saber: você pode vincular funções de seta? (E se sim, como?)
Testei o código acima no Google Chrome 48 e Firefox 43, e o resultado é o mesmo.
javascript
function
ecmascript-6
Florrie
fonte
fonte
this
escopo pai.Respostas:
Você não pode religar
this
em uma função de seta. Será sempre definido como o contexto em que foi definido. Se você precisarthis
ser significativo, use uma função normal.Do ECMAScript 2015 Spec :
fonte
this
. Os dois estão relacionados, mas não são os mesmos.this
dentro de uma função de seta sempre 'herda' othis
do escopo. Essa é uma característica das funções de seta. Mas você ainda podebind
todos os outros parâmetros de uma função de seta. Apenas nãothis
.Para concluir, você pode reconectar as funções das setas, apenas não pode alterar o significado de
this
.bind
ainda tem valor para argumentos da função:Experimente aqui: http://jsbin.com/motihanopi/edit?js,console
fonte
this
(que é, obviamente, definida lexicamente)?Do MDN :
Isso significa que você não pode vincular um valor
this
como desejar.fonte
Por anos, os desenvolvedores do js lutaram com a vinculação de contexto, perguntaram por que
this
mudaram no javascript, tanta confusão ao longo dos anos devido à vinculação de contexto e a diferença entre o significado dethis
javascript ethis
na maioria das outras linguagens OOP.Tudo isso me leva a perguntar, por que, por que! por que você não queria reativar uma função de seta! Aqueles onde criado especialmente para resolver todos estes problemas e confusões e evitar ter que usar
bind
oucall
ou qualquer outra forma de preservar o escopo da função.TL; DR
Não, você não pode religar as funções de seta.
fonte
this
não é funcional. lambdas deve serarguments => output
. Se você precisar de algum contexto externo, transmita-o. A própria existência dissothis
é o que facilitou toda a manutenção de padrões OO na linguagem. Você nunca teria ouvido o termo "classe javascript" sem ele.this
.Você não pode
bind
alterar o valor dethis
dentro de uma função de seta. No entanto, você pode criar uma nova função regular que faça a mesma coisa que a seta antiga e, em seguida, usecall
oubind
para reconfigurarthis
normalmente.Usamos uma
eval
chamada aqui para recriar a função de seta que você passa como uma função normal e, em seguida, usa-acall
para invocá-la com uma função diferentethis
:fonte
As funções de seta do ES6 realmente resolvem "isso" em JavaScript
O link acima explica que as funções das setas
this
não mudam com asbind, call, apply
funções.É explicado com um exemplo muito bom.
execute isso
node v4
para ver o comportamento "esperado",fonte
Fiz a mesma pergunta há alguns dias.
Você não pode vincular um valor, pois o
this
já está vinculado.Vinculando este escopo diferente ao operador ES6 => function
fonte
this
está vinculado " - Nas funções regulares também está vinculado. O ponto é que, nas funções de seta, ele não possui ligação local .Resumindo, você NÃO pode vincular funções de seta, mas continue lendo:
Imagine que você tem esta função de seta abaixo da qual é impressa
this
no console:Portanto, a solução rápida para isso seria usar a função normal, então altere-a para:
Em seguida, você pode vinculá-lo a qualquer ambiente lexical usando
bind
oucall
ouapply
:e chamá-lo em caso de
bind
.Também existem maneiras de usá
eval()
-lo, o que não é recomendado .fonte
function myFunc
é comportamentalmente diferente, além de ser vinculável; uma correspondência mais próxima seriaconst myFunc = function() {...}
. Também estou curioso sobre o que você quer dizer com eval, já que essa é uma abordagem que acho que nenhuma resposta já foi compartilhada aqui antes - seria interessante ver como isso é feito e depois ler por que é tão fortemente desencorajado.Talvez este exemplo ajude você:
fonte