Функция как объект. Методы call и apply

Последнее обновление: 24.10.2023

В JavaScript функция тоже является объектом - объектом Function и тоже имеет прототип, свойства, методы. Все функции, которые используются в программе, являются объектами Function и имеют все его свойства и методы.

Например, мы можем создать функцию с помощью конструктора Function:

const square = new Function("n", "return n * n;");
console.log(square(5));     // 25

В конструктор Function может передаваться ряд параметров. Последний параметр представляет собой само тело функции в виде строки. Фактически строка содержит код javascript. Предыдущие аргументы содержат названия параметров. В данном случае определяется функция возведения числа в квадрат, которая имеет один параметр n.

Среди свойств объекта Function можно выделить следующие:

  • arguments: массив аргументов, передаваемых в функцию

  • length: определяет количество аргументов, которые ожидает функция

  • caller: определяет функцию, вызвавшую текущую выполняющуюся функцию

  • name: имя функции

  • prototype: прототип функции

С помощью прототипа мы можем определить дополнительные свойства:

function sayHello(){
	
	console.log("Hello");
}
// изменяем прототип для всех функций
Function.prototype.program ="Hello World";

console.log(sayHello.program); // Hello World

Среди методов надо отметить методы call() и apply().

Метод call() вызывает функцию с указанным значением this и аргументами:

function sum(x, y){
	
	return x + y;
}
const result = sum.call(this, 3, 8);

console.log(result); // 11

this указывает на объект, для которого вызывается функция - в данном случае это глобальный объект window. После this передаются значения для параметров.

При передаче объекта через первый параметр, мы можем ссылаться на него через ключевое слово this:

function User (name, age) {
	this.name = name;
	this.age = age;
}
const tom = new User("Tom", 39);
function print(){
	console.log("Name:", this.name);
}
print.call(tom); // Name: Tom

В данном случае передается только одно значение, поскольку функция print не принимает параметров. То есть функция будет вызываться для объекта tom.

Если нам не важен объект, для которого вызывается функция, то можно передать значение null:

function sum(x, y){
	
	return x + y;
}
const result = sum.call(null, 3, 8);

console.log(result); // 11

На метод call() похож метод apply(), который также вызывает функцию и в качестве первого параметра также получает объект, для которого функция вызывается. Только теперь в качестве второго параметра передается массив аргументов:

function sum(x, y){
	
	return x + y;
}
const result = sum.apply(null, [3, 8]);

console.log(result); // 11
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850