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 objeto automobile
com um método push_button_engineStart
.
var your_scooter, your_car, your_jet;
var automobile = {
push_button_engineStart: function (runtime){
console.log(this.name + "'s" + ' engine_started, buckle up for the ride for ' + runtime + " minutes");
}
}
Vamos entender quando é chamada e aplicar usado. Suponhamos que você seja um engenheiro e tenha your_scooter
, your_car
e your_jet
que não veio com um push_button_engine_start, e que deseja usar um terceiro push_button_engineStart
.
Se você executar as seguintes linhas de código, elas darão um erro. PORQUE?
//your_scooter.push_button_engineStart();
//your_car.push_button_engineStart();
//your_jet.push_button_engineStart();
automobile.push_button_engineStart.apply(your_scooter,[20]);
automobile.push_button_engineStart.call(your_jet,10);
automobile.push_button_engineStart.call(your_car,40);
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.
- contexto
- argumentos
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 separado push_button_engineStart
separadamente para iniciar nossos automóveis individualmente em qualquer estágio posterior da execução que desejamos.
var scooty_engineStart = automobile.push_button_engineStart.bind(your_scooter);
var car_engineStart = automobile.push_button_engineStart.bind(your_car);
var jet_engineStart = automobile.push_button_engineStart.bind(your_jet);
setTimeout(scooty_engineStart,5000,30);
setTimeout(car_engineStart,10000,40);
setTimeout(jet_engineStart,15000,5);
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);