Eu já sei disso apply
e call
são funções semelhantes que definem this
(contexto de uma função).
A diferença está na maneira como enviamos os argumentos (manual versus array)
Questão:
Mas quando devo usar o bind()
método?
var obj = {
x: 81,
getX: function() {
return this.x;
}
};
alert(obj.getX.bind(obj)());
alert(obj.getX.call(obj));
alert(obj.getX.apply(obj));
javascript
arrays
function
Royi Namir
fonte
fonte
call()
você passe argumentos individualmente eapply()
como uma matriz de argumentos. Para mais detalhes, consulte a documentação vinculada, que deve responder completamente à sua pergunta.kind of weird there is not an existing question about this :
Quanto a isso. Provavelmente porquebind()
foi adicionado depois que os outros dois já existiam no JavaScript 1.8.5 - ECMA-262, 5ª edição. Enquantocall()
eapply()
existem desde JavaScript 1.3 - ECMA-262 3rd Edition. O SO tem perguntas sobre eles, como: qual é a diferença entre ligar e aplicar . Eu só estou supondo que eu estava me perguntando isso.Respostas:
Eu criei essa comparação entre objetos de função, chamadas de função
call/apply
ebind
um tempo atrás:.bind
permite definir othis
valor agora e executar a função no futuro , pois retorna um novo objeto de função.fonte
Use
.bind()
quando desejar que essa função seja chamada posteriormente com um determinado contexto, útil em eventos. Use.call()
ou.apply()
quando desejar chamar a função imediatamente e modifique o contexto.Chamar / aplicar chama a função imediatamente, enquanto
bind
retorna uma função que, quando executada mais tarde, terá o contexto correto definido para chamar a função original. Dessa forma, você pode manter o contexto em retornos de chamada e eventos assíncronos.Eu faço muito isso:
Eu o uso extensivamente no Node.js para retornos de chamada assíncronos para os quais desejo passar um método membro, mas ainda quero que o contexto seja a instância que iniciou a ação assíncrona.
Uma implementação simples e ingênua de bind seria como:
Há mais do que isso (como passar outros argumentos), mas você pode ler mais sobre isso e ver a implementação real no MDN .
Espero que isto ajude.
fonte
bind
retorna.Todos eles anexam isso à função (ou objeto) e a diferença está na invocação da função (veja abaixo).
A chamada anexa isso à função e executa a função imediatamente:
bind anexa isso à função e precisa ser chamado separadamente assim:
ou assim:
apply é semelhante à chamada, exceto pelo fato de ser necessário um objeto de matriz em vez de listar os argumentos um de cada vez:
fonte
"use strict"
para evitar a substituição dessas palavras-chave reservadas. +1.Exemplos de Apply vs. Call vs. Bind
Ligar
Aplique
Ligar
Quando usar cada
Ligar e aplicar são bastante intercambiáveis. Apenas decida se é mais fácil enviar uma matriz ou uma lista de argumentos separados por vírgula.
Eu sempre lembro qual é qual, lembrando que Call é para vírgula (lista separada) e Apply é para Array.
Vincular é um pouco diferente. Retorna uma nova função. Call and Apply executa a função atual imediatamente.
O Bind é ótimo para muitas coisas. Podemos usá-lo para curry funções como no exemplo acima. Podemos pegar uma função simples de olá e transformá-la em um helloJon ou helloKelly. Também podemos usá-lo para eventos como onClick, onde não sabemos quando eles serão demitidos, mas sabemos em que contexto queremos que eles tenham.
Referência: codeplanet.io
fonte
call
eapply
, segue-se que, se você não tem umthis
dentro do método, atribuiria o primeiro argumento como anull
?var person1 = {firstName: 'Jon', lastName: 'Kuperman'}; function say(greeting) { console.log(greeting + ' ' + this.firstName + ' ' + this.lastName); } say.apply(person1, ['Hello']); // Hello Jon Kuperman
Funciona perfeitamente bem e gera VM128: 4 Olá Jon KupermanPermite definir o valor para
this
independente de como a função é chamada. Isso é muito útil ao trabalhar com retornos de chamada:Para alcançar o mesmo resultado com,
call
ficaria assim:fonte
.bind()
como você mostrou antes está incorreto. Quando você usafn.bind(obj)
outra função, será retornado (não que você tenha criado antes). E não há habilidades para alterar o valorthis
dentro dabinded
função. Principalmente, isso é usado para othis
seguro de retorno de chamada . Mas no seu exemplo - não há diferenças no resultado. Masfn !== fn.bind(obj);
observe isso.Assuma que temos
multiplication
funçãoVamos criar algumas funções padrão usando
bind
var multiby2 = multiplication.bind(this,2);
Agora multiby2 (b) é igual à multiplicação (2, b);
E se eu passar os dois parâmetros no bind
Agora getSixAlways () é igual à multiplicação (3,2);
mesmo passando o parâmetro retorna 6;
getSixAlways(12); //6
Isso cria uma nova função de multiplicação e a atribui a magicMultiplication.
Ah, não, estamos escondendo a funcionalidade de multiplicação em magicMultiplication.
chamando
magicMultiplication
retorna um espaço em brancofunction b()
na execução funciona bem
magicMultiplication(6,5); //30
Que tal ligar e aplicar?
magicMultiplication.call(this,3,2); //6
magicMultiplication.apply(this,[5,2]); //10
Em palavras simples,
bind
cria a funçãocall
eapply
executa a função enquantoapply
espera os parâmetros na matrizfonte
bind
cria a funçãocall
eapply
executa a função enquantoapply
espera os parâmetros na matriz"Ambos
Function.prototype.call()
eFunction.prototype.apply()
chamam uma função com um determinadothis
valor e retornam o valor de retorno dessa função.Function.prototype.bind()
, por outro lado, cria uma nova função com um determinadothis
valor e retorna essa função sem executá-la.Então, vamos assumir uma função que se parece com isso:
Agora, vamos pegar um objeto que se parece com isso:
Podemos vincular nossa função ao nosso objeto assim:
Agora, podemos executar
Obj.log
em qualquer lugar do nosso código:O que realmente interessa é quando você não apenas vincula um valor para
this
, mas também para seu argumentoprop
:Agora podemos fazer isso:
fonte
bind : liga a função com o valor e o contexto fornecidos, mas não executa a função. Para executar a função, você precisa chamar a função.
chamada : Executa a função com contexto e parâmetro fornecidos.
apply : Executa a função com o contexto e o parâmetro fornecidos como array .
fonte
Aqui está um bom artigo para ilustrar a diferença entre
bind()
,apply()
ecall()
, resumi-lo como abaixo.bind()
permite definir facilmente qual objeto específico será vinculado a isso quando uma função ou método é invocado.bind()
nos permitem emprestar métodosUm problema com este exemplo é que estamos adicionando um novo método
showData
aocars
objeto e talvez não desejemos fazer isso apenas para emprestar um método, porque o objeto cars já pode ter um nome de propriedade ou métodoshowData
. Não queremos substituí-lo acidentalmente. Como veremos em nossa discussão sobreApply
eCall
abaixo, é melhor emprestar um método usando o métodoApply
ouCall
.bind()
nos permitem curry uma funçãoA função Currying , também conhecida como aplicativo de função parcial , é o uso de uma função (que aceita um ou mais argumentos) que retorna uma nova função com alguns dos argumentos já definidos.
Podemos usar
bind()
para curry estagreet
funçãoapply()
oucall()
para definir esse valorA
apply
,call
ebind
métodos são usados para definir a este valor ao chamar um método, e eles fazem isso de forma ligeiramente diferente para permitir o uso controle direto e versatilidade no nosso código JavaScript.Os métodos
apply
ecall
são quase idênticos ao definir esse valor, exceto que você passa os parâmetros da funçãoapply ()
como uma matriz , enquanto você precisa listar os parâmetros individualmente para passá-los aocall ()
método.Aqui está um exemplo para usar
call
ouapply
definir isso na função de retorno de chamada.Empréstimo funciona com
apply
oucall
Métodos de empréstimo de matriz
Vamos criar um
array-like
objeto e emprestar alguns métodos de matriz para operar em nosso objeto semelhante a matriz.Outro caso comum é que converter
arguments
em array da seguinte maneiraEmprestar outros métodos
Use
apply()
para executar a função de variável arityEste
Math.max
é um exemplo de função de variável aridade,Mas e se tivermos uma matriz de números para transmitir
Math.max
? Não podemos fazer isso:É aqui que o
apply ()
método nos ajuda a executar funções variadas . Em vez do acima, temos que passar a matriz de números usandoapply (
) assim:fonte
call / apply executa a função imediatamente:
bind não executa a função imediatamente, mas retorna a função Apply aplicada (para execução posterior):
fonte
Sintaxe
Aqui
fonte
A diferença básica entre Chamar, Aplicar e Vincular são:
A ligação será usada se você desejar que seu contexto de execução seja exibido mais adiante na figura.
Ex:
Digamos que eu queira usar esse método em alguma outra variável
Para usar a referência de carro em alguma outra variável, você deve usar
Vamos falar sobre o uso mais extenso da função de ligação
Por quê? Como agora func é bind com o número 1, se não usarmos bind nesse caso, ele apontará para Objeto Global.
Chamar, Aplicar são usados quando você deseja executar a instrução ao mesmo tempo.
fonte
Ligue para aplicar e vincular. e como eles são diferentes.
Vamos aprender a ligar e aplicar usando qualquer terminologia diária.
Você tem três automóveis
your_scooter , your_car and your_jet
que começam com o mesmo mecanismo (método). Nós criamos um objetoautomobile
com um métodopush_button_engineStart
.Vamos entender quando é chamada e aplicar usado. Suponhamos que você seja um engenheiro e tenha
your_scooter
,your_car
eyour_jet
que não veio com um push_button_engine_start, e que deseja usar um terceiropush_button_engineStart
.Se você executar as seguintes linhas de código, elas darão um erro. PORQUE?
Portanto, o exemplo acima fornece com êxito o seu_scooter, seu_carro, seu_jato, um recurso do objeto automóvel.
Vamos nos aprofundar Aqui vamos dividir a linha de código acima.
automobile.push_button_engineStart
está nos ajudando a obter o método que está sendo usado.Além disso, usamos apply ou call usando a notação de ponto.
automobile.push_button_engineStart.apply()
Agora aplique e chame aceitar dois parâmetros.
Então, aqui configuramos o contexto na linha final do código.
automobile.push_button_engineStart.apply(your_scooter,[20])
A diferença entre call e apply é apenas o apply que aceita parâmetros na forma de uma matriz, enquanto a chamada simplesmente pode aceitar uma lista de argumentos separados por vírgula.
o que é a função JS Bind?
Uma função de ligação é basicamente o que liga o contexto de algo e, em seguida, armazena-o em uma variável para execução posteriormente.
Vamos melhorar ainda mais o nosso exemplo anterior. Anteriormente, usamos um método pertencente ao objeto automóvel e o equipamos
your_car, your_jet and your_scooter
. Agora vamos imaginar que queremos dar um separadopush_button_engineStart
separadamente para iniciar nossos automóveis individualmente em qualquer estágio posterior da execução que desejamos.ainda não está satisfeito?
Vamos deixar claro como uma lágrima. Hora de experimentar. Voltaremos a chamar e aplicar o aplicativo de funções e tentar armazenar o valor da função como referência.
A experiência abaixo falha porque call e apply são invocados imediatamente; portanto, nunca chegamos ao estágio de armazenar uma referência em uma variável que é onde a função bind rouba o show
var test_function = automobile.push_button_engineStart.apply(your_scooter);
fonte
Call: call chama a função e permite que você passe argumentos um por um
Apply: Apply chama a função e permite que você passe argumentos como uma matriz
Vincular: Vincular retorna uma nova função, permitindo que você transmita essa matriz e qualquer número de argumentos.
fonte
call (): - Aqui passamos os argumentos da função individualmente, não em um formato de matriz
apply (): - Aqui passamos os argumentos da função em um formato de matriz
ligar() :--
fonte
Chamada JavaScript ()
Aplicar JavaScript ()
** a função call e apply é chamada de diferença, usa um argumento separado, mas aplica um array como: [1,2,3]
JavaScript bind ()
fonte
Imagine, o bind não está disponível. você pode construí-lo facilmente da seguinte maneira:
fonte
fonte
O principal conceito por trás de todos esses métodos é a função Burrowing .
O empréstimo de funções nos permite usar os métodos de um objeto em um objeto diferente sem precisar fazer uma cópia desse método e mantê-lo em dois locais separados. É realizado através do uso de. ligar() , . apply () ou. bind (), todos os quais existem para definir explicitamente isso no método que estamos emprestando
Abaixo está um exemplo de todos esses métodos
LIGAR
APLIQUE
LIGAR
printMyNAme () é a função que chama a função
abaixo está o link para jsfiddle
https://codepen.io/Arham11/pen/vYNqExp
fonte
Eu acho que os mesmos lugares deles são: todos eles podem alterar o valor de uma função. As diferenças deles são: a função bind retornará uma nova função como resultado; os métodos de chamada e aplicação executam a função imediatamente, mas a aplicação pode aceitar uma matriz como parâmetros e analisará a matriz separada. Além disso, a função de ligação pode ser Currying.
fonte
A função bind deve ser usada quando queremos atribuir uma função com contexto específico, por exemplo.
no exemplo acima, se chamarmos a função demo.setValue () e passarmos a função this.getValue diretamente, ela não chamará a função demo.setValue diretamente porque isso em setTimeout se refere ao objeto de janela, portanto, precisamos passar o contexto do objeto de demonstração para this.getValue função usando bind. significa que apenas passamos a função com o contexto do objeto de demonstração e não chamamos a função de verdade.
Espero que você entenda .
Para obter mais informações, consulte a função de ligação do javascript.
fonte