Wywoływanie funkcji z tablicą argumentów - apply
Jak wywołać dowolną funkcję z listą argumentów zapisaną w tablicy?
Function.prototype.apply(thisArg) Function.prototype.apply(thisArg, argArray)
- Parametry:
- thisArg - wartość bieżącego obiektu
this
dostępnego w czasie wywołania wewnątrz ciała funkcji Array
argArray - lista argumentów wywołania funkcji- Wartość:
- wartość którą normalnie zwraca funkcja
- Wyjątki:
TypeError
- nastąpiła próba wywołania na obiekcie, który nie jest funkcją albo argArray nie jest obiektem
Zdarza się, że w naszym programie mamy dostępną listę argumentów w postaci tablicy i chcielibyśmy wywołać zadaną funkcję, przekazując jej taką właśnie listę argumentów. Niestety gdy zrobimy to w tradycyjny sposób, funkcja otrzyma tylko jeden argument - w postaci tablicy. Aby w takiej sytuacji skonwertować tablicę na tradycyjną listę argumentów, możemy się posłużyć funkcją apply
.
Dzięki tej funkcji, możemy również wywołać metodę w kontekście innego obiektu niż ten, w którym została zdefiniowana, nawet jeżeli jedna klasa nie dziedziczy po drugiej.
Przykład Function.prototype.apply
var f = function (a, b) { return a + b; }; var args = [1, 2]; f(args); // "1,2undefined" f.apply(null, args); // 3 var Person = function (name) { this.name = name; }; Person.prototype.speak = function (speech) { return this.name + ": " + speech; }; var Computer = function (name) { this.name = name; }; var obj = new Computer('HAL 9000'); var txt = 'My mind is going. I can feel it.'; Person.prototype.speak.apply(obj, [txt]); // "HAL 9000: My mind is going. I can feel it." Function.prototype.apply.call(null); // TypeError Function.prototype.apply.call(undefined); // TypeError Function.prototype.apply.call("test"); // TypeError Function.prototype.apply.call({}); // TypeError f.apply(null, "test"); // TypeError