Ik weet al dat apply
en call
vergelijkbare functies zijn diethis
instellen (context van een functie).
Het verschil zit in de manier waarop we de argumenten verzenden (handmatig versus array)
Vraag:
Maar wanneer moet ik de methode bind()
gebruiken?
var obj = {
x: 81,
getX: function() {
return this.x;
}
};
alert(obj.getX.bind(obj)());
alert(obj.getX.call(obj));
alert(obj.getX.apply(obj));
Antwoord 1, autoriteit 100%
Ik heb een tijdje geleden deze vergelijking gemaakt tussen functieobjecten, functieaanroepen, call/apply
en bind
:
.bind
stelt u in staat om de this
waarde nuin te stellen terwijl u de functie in de toekomst, omdat het een nieuw functie-object retourneert.
Antwoord 2, autoriteit 95%
Gebruik .bind()
als je wilt dat die functie later wordt aangeroepen met een bepaalde context, handig bij evenementen. Gebruik .call()
of .apply()
wanneer u de functie onmiddellijk wilt aanroepen en de context wilt wijzigen.
Bel/pas de functie onmiddellijk toe, terwijl bind
een functie retourneert die, wanneer deze later wordt uitgevoerd, de juiste context heeft voor het aanroepen van de oorspronkelijke functie. Op deze manier kunt u de context behouden in asynchrone callbacks en gebeurtenissen.
Ik doe dit veel:
function MyObject(element) {
this.elm = element;
element.addEventListener('click', this.onClick.bind(this), false);
};
MyObject.prototype.onClick = function(e) {
var t=this; //do something with [t]...
//without bind the context of this function wouldn't be a MyObject
//instance as you would normally expect.
};
Ik gebruik het uitgebreid in Node.js voor asynchrone callbacks waarvoor ik een lidmethode wil doorgeven, maar wil toch dat de context de instantie is die de asynchrone actie startte.
Een eenvoudige, naïeve implementatie van bind zou zijn als:
Function.prototype.bind = function(ctx) {
var fn = this;
return function() {
fn.apply(ctx, arguments);
};
};
Er is meer aan de hand (zoals het doorgeven van andere argumenten), maar je kunt er meer over lezen en de echte implementatie zien op de MDN.
Hopelijk helpt dit.
Antwoord 3, autoriteit 90%
Ze voegen allemaal dittoe aan functie (of object) en het verschil zit in de functieaanroep (zie hieronder).
aanroepvoegt dittoe aan de functie en voert de functie onmiddellijk uit:
var person = {
name: "James Smith",
hello: function(thing) {
console.log(this.name + " says hello " + thing);
}
}
person.hello("world"); // output: "James Smith says hello world"
person.hello.call({ name: "Jim Smith" }, "world"); // output: "Jim Smith says hello world"
bindkoppelt thisaan functie en moet apart worden aangeroepen als volgt:
var person = {
name: "James Smith",
hello: function(thing) {
console.log(this.name + " says hello " + thing);
}
}
person.hello("world"); // output: "James Smith says hello world"
var helloFunc = person.hello.bind({ name: "Jim Smith" });
helloFunc("world"); // output: Jim Smith says hello world"
of zoals dit:
...
var helloFunc = person.hello.bind({ name: "Jim Smith" }, "world");
helloFunc(); // output: Jim Smith says hello world"
applylijkt op callbehalve dat er een array-achtig object voor nodig is in plaats van de argumenten één voor één op te sommen:
function personContainer() {
var person = {
name: "James Smith",
hello: function() {
console.log(this.name + " says hello " + arguments[1]);
}
}
person.hello.apply(person, arguments);
}
personContainer("world", "mars"); // output: "James Smith says hello mars", note: arguments[0] = "world" , arguments[1] = "mars"
Antwoord 4, autoriteit 93%
Antwoord in EENVOUDIGSTE vorm
- Callroept de functie op en stelt u in staat argumenten één voor één in te voeren
een. - Toepassenroept de functie op en stelt u in staat argumenten door te geven
als een array. - Bindretourneert een nieuwe functie, waarmee u een . kunt doorgeven
deze array en een willekeurig aantal argumenten.
Toepassen vs. Call vs. Bind-voorbeelden
Bel
var person1 = {firstName: 'Jon', lastName: 'Kuperman'};
var person2 = {firstName: 'Kelly', lastName: 'King'};
function say(greeting) {
console.log(greeting + ' ' + this.firstName + ' ' + this.lastName);
}
say.call(person1, 'Hello'); // Hello Jon Kuperman
say.call(person2, 'Hello'); // Hello Kelly King
Toepassen
var person1 = {firstName: 'Jon', lastName: 'Kuperman'};
var person2 = {firstName: 'Kelly', lastName: 'King'};
function say(greeting) {
console.log(greeting + ' ' + this.firstName + ' ' + this.lastName);
}
say.apply(person1, ['Hello']); // Hello Jon Kuperman
say.apply(person2, ['Hello']); // Hello Kelly King
Inbinden
var person1 = {firstName: 'Jon', lastName: 'Kuperman'};
var person2 = {firstName: 'Kelly', lastName: 'King'};
function say() {
console.log('Hello ' + this.firstName + ' ' + this.lastName);
}
var sayHelloJon = say.bind(person1);
var sayHelloKelly = say.bind(person2);
sayHelloJon(); // Hello Jon Kuperman
sayHelloKelly(); // Hello Kelly King
Wanneer elk te gebruiken
Bellen en solliciteren zijn redelijk uitwisselbaar. Bepaal gewoon of het gemakkelijker is om een array of een door komma’s gescheiden lijst met argumenten in te sturen.
Ik onthoud altijd welke welke is door te onthouden dat Oproep voor komma is (gescheiden lijst) en Toepassen voor Array is.
Inbinden is een beetje anders. Het geeft een nieuwe functie terug. Bellen en Toepassen voeren de huidige functie onmiddellijk uit.
Bind is geweldig voor veel dingen. We kunnen het gebruiken om te curry-functies zoals in het bovenstaande voorbeeld. We kunnen een eenvoudige hallo-functie maken en veranderen in een hellojon of hellokellelly. We kunnen het ook gebruiken voor evenementen zoals OnClick, waar we niet weten wanneer ze zullen worden ontslagen, maar we weten welke context dat we willen.
Referentie: codeplanet.io
Antwoord 5, autoriteit 24%
Hiermee kan de waarde voor this
worden ingesteld, onafhankelijk van hoe de functie wordt aangeroepen. Dit is erg handig bij het werken met terugbellen:
function sayHello(){
alert(this.message);
}
var obj = {
message : "hello"
};
setTimeout(sayHello.bind(obj), 1000);
Als u hetzelfde resultaat wilt bereiken met call
ziet u er als volgt uit:
function sayHello(){
alert(this.message);
}
var obj = {
message : "hello"
};
setTimeout(function(){sayHello.call(obj)}, 1000);
6, Autoriteit 11%
Bind : het bindt de functie met opgegeven waarde en context, maar het voert de functie niet uit. Om de functie uit te voeren, moet u de functie bellen.
bel : het voert de functie uit met verstrekte context en parameter.
toepassen: het voert de functie uit met de verstrekte context en
parameter als array.
Antwoord 7, autoriteit 9%
Het belangrijkste concept achter al deze methoden is Function burrowing.
Het lenen van functies stelt ons in staat om de methoden van het ene object op een ander object te gebruiken zonder een kopie van die methode te hoeven maken en deze op twee verschillende plaatsen te bewaren. Het wordt bereikt door het gebruik van . telefoongesprek() , . toepassen() , of . bind() , die allemaal bestaan om dit expliciet in te stellen op de methode die we lenen
- Callroept de functie onmiddellijk op en stelt u in staat argumenten één voor één in te voeren
een - Toepassenroept de functie onmiddellijk op en stelt u in staat om argumenten door te geven
als een array. - Bindretourneert een nieuwe functie en u kunt deze op elk gewenst moment aanroepen/aanroepen door een functie aan te roepen.
Hieronder staat een voorbeeld van al deze methoden
let name = {
firstname : "Arham",
lastname : "Chowdhury",
}
printFullName = function(hometown,company){
console.log(this.firstname + " " + this.lastname +", " + hometown + ", " + company)
}
BEL
het eerste argument, bijv. naam binnen aanroepmethode is altijd een verwijzing
naar (deze) variabele en de laatste zal functievariabele zijn
printFullName.call(name,"Mumbai","Taufa"); //Arham Chowdhury, Mumbai, Taufa
TOEPASSEN
apply-methode is hetzelfde als de call-methode
het enige verschil is dat de functieargumenten worden doorgegeven in de arraylijst
printFullName.apply(name, ["Mumbai","Taufa"]); //Arham Chowdhury, Mumbai, Taufa
binden
Bindmethode is hetzelfde als oproep, behalve dat de binding een functie retourneert die later kan worden gebruikt door het aan te roepen (roept het niet onmiddellijk)
let printMyNAme = printFullName.bind(name,"Mumbai","Taufa");
printMyNAme(); //Arham Chowdhury, Mumbai, Taufa
PrintMyName () is de functie die de functie
roept
Hieronder staat de link voor JSFiddle
https://codepen.io/arham11/pen/vynqexp
Antwoord 8, autoriteit 5%
Het fundamentele verschil tussen Bellen, Toepassen en Binden is:
Bind wordt gebruikt als u wilt dat uw uitvoeringscontext later in beeld komt.
Bijvoorbeeld:
var car = {
registrationNumber: "007",
brand: "Mercedes",
displayDetails: function(ownerName){
console.log(ownerName + ' this is your car ' + '' + this.registrationNumber + " " + this.brand);
}
}
car.displayDetails('Nishant'); // **Nishant this is your car 007 Mercedes**
Stel dat ik deze methode in een andere variabele wil gebruiken
var car1 = car.displayDetails('Nishant');
car1(); // undefined
Als u de referentie van auto in een andere variabele wilt gebruiken, moet u
var car1 = car.displayDetails.bind(car, 'Nishant');
car1(); // Nishant this is your car 007 Mercedes
Laten we het hebben over een uitgebreider gebruik van de bindfunctie
var func = function() {
console.log(this)
}.bind(1);
func();
// Number: 1
Waarom? Omdat func nu bind is met nummer 1, als we in dat geval geen bind gebruiken, verwijst het naar globaal object.
var func = function() {
console.log(this)
}.bind({});
func();
// Object
Call, Apply worden gebruikt wanneer u de instructie tegelijkertijd wilt uitvoeren.
var Name = {
work: "SSE",
age: "25"
}
function displayDetails(ownerName) {
console.log(ownerName + ", this is your name: " + 'age' + this.age + " " + 'work' + this.work);
}
displayDetails.call(Name, 'Nishant')
// Nishant, this is your name: age25 workSSE
// In apply we pass an array of arguments
displayDetails.apply(Name, ['Nishant'])
// Nishant, this is your name: age25 workSSE
Antwoord 9, autoriteit 4%
call/applyvoert de functie onmiddellijk uit:
func.call(context, arguments);
func.apply(context, [argument1,argument2,..]);
bindvoert de functie niet onmiddellijk uit, maar retourneert de ingepakte apply-functie (voor latere uitvoering):
function bind(func, context) {
return function() {
return func.apply(context, arguments);
};
}
Antwoord 10, autoriteit 3%
Syntaxis
- aanroepen(thisArg, arg1, arg2, …)
- toepassen(thisArg, argsArray)
- bind(thisArg[, arg1[, arg2[, …]]])
Hier
- thisArg is het object
- argArray is een array-object
- arg1, arg2, arg3,… zijn aanvullende argumenten
function printBye(message1, message2){
console.log(message1 + " " + this.name + " "+ message2);
}
var par01 = { name:"John" };
var msgArray = ["Bye", "Never come again..."];
printBye.call(par01, "Bye", "Never come again...");
//Bye John Never come again...
printBye.call(par01, msgArray);
//Bye,Never come again... John undefined
//so call() doesn't work with array and better with comma seperated parameters
//printBye.apply(par01, "Bye", "Never come again...");//Error
printBye.apply(par01, msgArray);
//Bye John Never come again...
var func1 = printBye.bind(par01, "Bye", "Never come again...");
func1();//Bye John Never come again...
var func2 = printBye.bind(par01, msgArray);
func2();//Bye,Never come again... John undefined
//so bind() doesn't work with array and better with comma seperated parameters
Antwoord 11, autoriteit 3%
Bel toepassen en binden. en hoe ze verschillen.
Laten we leren bellen en solliciteren met elke dagelijkse terminologie.
Je hebt drie auto’s your_scooter , your_car and your_jet
die met hetzelfde mechanisme (methode) beginnen.
We hebben een object automobile
gemaakt met een methode 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");
}
}
Laten we begrijpen wanneer bellen en solliciteren wordt gebruikt. Stel dat u een monteur bent en u heeft your_scooter
, your_car
en your_jet
die niet zijn geleverd met een push_button_engine_start en u wilt een derde party push_button_engineStart
.
Als je de volgende regels code uitvoert, geven ze een foutmelding. WAAROM?
//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);
Dus het bovenstaande voorbeeld geeft uw_scooter, uw_auto, uw_jet met succes een functie van het auto-object.
Laten we dieper duiken
Hier zullen we de bovenstaande regel code splitsen.
automobile.push_button_engineStart
helpt ons om de gebruikte methode te krijgen.
Verder gebruiken we toepassen of bellen met de puntnotatie.
automobile.push_button_engineStart.apply()
Toepassen en roep accepteer nu twee parameters.
- context
- argumenten
Dus hier plaatsen we de context in de laatste regel code.
automobile.push_button_engineStart.apply(your_scooter,[20])
Verschil tussen aanroepen en toepassenis alleen dat van toepassing zijn parameters in de vorm van een array worden geaccepteerd, terwijl aanroep eenvoudig een door komma’s gescheiden lijst met argumenten kan accepteren.
wat is de JS Bind-functie?
Een bindfunctie is in feite die de context van iets bindt en deze vervolgens opslaat in een variabele voor uitvoering in een later stadium.
Laten we ons vorige voorbeeld nog beter maken. Eerder hebben we een methode gebruikt die bij het auto-object hoort en deze gebruikten om your_car, your_jet and your_scooter
uit te rusten. Laten we ons nu voorstellen dat we een aparte push_button_engineStart
apart willen geven om onze auto’s individueel te starten in elk later stadium van de uitvoering die we willen.
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);
nog steeds niet tevreden?
Laten we het duidelijk maken als een traan. Tijd om te experimenteren. We gaan terug om de functietoepassing aan te roepen en toe te passen en proberen de waarde van de functie als referentie op te slaan.
Het onderstaande experiment mislukt omdat call en apply onmiddellijk worden aangeroepen, daarom komen we nooit in het stadium van het opslaan van een referentie in een variabele, waar de bindfunctie de show steelt
var test_function = automobile.push_button_engineStart.apply(your_scooter);
Antwoord 12, autoriteit 2%
JavaScript-aanroep()
const person = {
name: "Lokamn",
dob: 12,
print: function (value,value2) {
console.log(this.dob+value+value2)
}
}
const anotherPerson= {
name: "Pappu",
dob: 12,
}
person.print.call(anotherPerson,1,2)
JavaScript toepassen()
name: "Lokamn",
dob: 12,
print: function (value,value2) {
console.log(this.dob+value+value2)
}
}
const anotherPerson= {
name: "Pappu",
dob: 12,
}
person.print.apply(anotherPerson,[1,2])
**call en apply functie zijn verschil call take apart argument maar pas take array toe
zoals: [1,2,3]
**
JavaScript bind()
name: "Lokamn",
dob: 12,
anotherPerson: {
name: "Pappu",
dob: 12,
print2: function () {
console.log(this)
}
}
}
var bindFunction = person.anotherPerson.print2.bind(person)
bindFunction()
Antwoord 13
Aanroep:aanroep roept de functie op en stelt u in staat argumenten één voor één door te geven
Toepassen:Apply roept de functie op en stelt u in staat argumenten als een array door te geven
Bind:Bind retourneert een nieuwe functie, waarmee u een this-array en een willekeurig aantal argumenten kunt invoeren.
var person1 = {firstName: 'Raju', lastName: 'king'};
var person2 = {firstName: 'chandu', lastName: 'shekar'};
function greet(greeting) {
console.log(greeting + ' ' + this.firstName + ' ' + this.lastName);
}
function greet2(greeting) {
console.log( 'Hello ' + this.firstName + ' ' + this.lastName);
}
greet.call(person1, 'Hello'); // Hello Raju king
greet.call(person2, 'Hello'); // Hello chandu shekar
greet.apply(person1, ['Hello']); // Hello Raju king
greet.apply(person2, ['Hello']); // Hello chandu shekar
var greetRaju = greet2.bind(person1);
var greetChandu = greet2.bind(person2);
greetRaju(); // Hello Raju king
greetChandu(); // Hello chandu shekar
Antwoord 14
call() :–Hier geven we de functieargumenten afzonderlijk door, niet in een array-indeling
var obj = {name: "Raushan"};
var greeting = function(a,b,c) {
return "Welcome "+ this.name + " to "+ a + " " + b + " in " + c;
};
console.log(greeting.call(obj, "USA", "INDIA", "ASIA"));
apply() :–Hier geven we de functieargumenten door in een array-indeling
var obj = {name: "Raushan"};
var cal = function(a,b,c) {
return this.name +" you got " + a+b+c;
};
var arr =[1,2,3]; // array format for function arguments
console.log(cal.apply(obj, arr));
bind() :–
var obj = {name: "Raushan"};
var cal = function(a,b,c) {
return this.name +" you got " + a+b+c;
};
var calc = cal.bind(obj);
console.log(calc(2,3,4));
Antwoord 15
Stel je voor, binden is niet beschikbaar.
je kunt het eenvoudig als volgt construeren:
var someFunction=...
var objToBind=....
var bindHelper = function (someFunction, objToBind) {
return function() {
someFunction.apply( objToBind, arguments );
};
}
bindHelper(arguments);
Antwoord 16
function sayHello() {
//alert(this.message);
return this.message;
}
var obj = {
message: "Hello"
};
function x(country) {
var z = sayHello.bind(obj);
setTimeout(y = function(w) {
//'this' reference not lost
return z() + ' ' + country + ' ' + w;
}, 1000);
return y;
}
var t = x('India')('World');
document.getElementById("demo").innerHTML = t;
Antwoord 17
Gebruik bind voor toekomstige aanroepen van de functie. Zowel apply
als call
roepen de functie op.
bind()
maakt het ook mogelijk om extra argumenten toe te voegen aan de args-array.
https://developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind
Antwoord 18
Ik denk dat ze dezelfde plaatsen zijn: ze kunnen allemaal de waarde van een functie wijzigen. De verschillen zijn: de bindfunctie zal als resultaat een nieuwe functie retourneren; de aanroep- en toepassingsmethoden zullen de functie onmiddellijk uitvoeren, maar toepassen kan een array accepteren als params, en het zal de array gescheiden ontleden. En de bindfunctie kan ook Currying zijn.
Antwoord 19
bindfunctie zou moeten worden gebruikt wanneer we een functie met een bepaalde context willen toewijzen voor bijv.
var demo = {
getValue : function(){
console.log('demo object get value function')
}
setValue : function(){
setTimeout(this.getValue.bind(this),1000)
}
}
Als we in het bovenstaande voorbeeld de functie demo.setValue() aanroepen en deze functie.getValue rechtstreeks doorgeven, wordt de functie demo.setValue niet rechtstreeks aangeroepen omdat dit in setTimeout verwijst naar een vensterobject, dus we moeten de context van het demo-object doorgeven aan this.getValue-functie met behulp van bind. het betekent dat we alleen de functie doorgeven met de context van het demo-object en niet echt de functie aanroepen.
Ik hoop dat je het begrijpt.
raadpleeg voor meer informatie
javascript-bindfunctie in detail bekend