W języku JavaScript możemy zmieniać kontekst, czyli zmienną this wewnątrz funkcji. Służą do tego trzy funkcje call, _apply _oraz bind. Funkcje call oraz apply są bardzo podobne **wywołują **one daną funkcje, zmieniając kontekst. Do funkcji call przekazujemy listę argumentów po przecinku natomiast do funkcji apply tablicę argumentów. Natomiast funkcja bind zwraca nową funkcję, w której kontekst jest zmieniony.
Nawiązując do przykładu z poprzedniego rozdziału, zamiast pożyczać funkcję i próbować ja wywołać, zbindujmy ją kontekstem manager.
var developer = {
work: "copy-pasting, stack overflow reading",
isDoing: function () {
console.log("My everyday work is " + this.work);
}
},
manager = {
work: "Outlook programming"
},
isDoingMethod = developer.isDoing.bind(manager); //binging z kontekstem manager
developer.isDoing(); //My everyday work is copy-pasting, stack overflow reading
isDoingMethod(); //My everyday work is Outlook programming
https://codepen.io/Bigismall/pen/PjzZzj
Widzimy tu, że isDoingMethod
jest funkcją wiążącą metodę isDooing()
oraz obiekt manager.
Funkcję bind łatwo zaimplementować wykorzystując call lub apply. O protypowaniu jeszcze sobie opowiemy.
if (!Function.prototype.bind) {
Function.prototype.bind = function (thisArg) {
var fn = this,
args = Array.prototype.slice.call(arguments, 1);
return function () {
return fn.apply(thisArg, args.concat(Array.prototype.slice.call(arguments)));
};
};
}
Źródła: