Функция как объект
В JavaScript функция тоже является объектом - объектом Function
и тоже имеет прототип, свойства, методы. Все функции, которые используются в программе, являются объектами Function
и имеют все его свойства и методы. Например, мы можем создать функцию с помощью конструктора Function
:
var square = new Function('n', 'return n * n;');
console.log(square(5));
В конструктор Function
может передаваться ряд параметров. Последний параметр представляет собой само тело функции в виде строки. Фактически строка содержит код javascript. Предыдущие аргументы содержат названия параметров. В данном случае определяется функция возведения числа в квадрат, которая имеет один параметр n
. Среди свойств объекта Function
можно выделить следующие:
arguments
массив аргументов, передаваемых в функциюlength
определяет количество аргументов, которые ожидает функцияcaller
определяет функцию, вызвавшую текущую выполняющуюся функциюname
имя функцииprototype
прототип функции
С помощью прототипа мы можем определить дополнительные свойства:
function display(){
console.log("привет мир");
}
Function.prototype.program ="Hello";
// Hello
console.log(display.program);
Методы call() и apply()
Среди методов надо отметить методы call()
и apply()
.
Метод call()
Метод call()
вызывает функцию с указанным значением this
и аргументами:
function add(x, y){
return x + y;
}
var result = add.call(this, 3, 8);
// 11
console.log(result);
this
указывает на объект, для которого вызывается функция - в данном случае это глобальный объект window
. После this
передаются значения для параметров.
При передаче объекта через первый параметр, мы можем ссылаться на него через ключевое слово this
:
function User (name, age) {
this.name = name;
this.age = age;
}
var tom = new User("Том", 26);
function display(){
console.log("Ваше имя: " + this.name);
}
// Ваше имя: Том
display.call(tom);
В данном случае передается только одно значение, поскольку функция display
не принимает параметров. То есть функция будет вызываться для объекта tom
.
Если нам не важен объект, для которого вызывается функция, то можно передать значение null
:
function add(x, y){
return x + y;
}
var result = add.call(null, 3, 8);
// 11
console.log(result);
Метод apply()
Метод вызывает функцию и в качестве первого параметра также получает объект, для которого функция вызывается. Только теперь в качестве второго параметра передается массив аргументов:
function add(x, y){
return x + y;
}
var result = add.apply(null, [3, 8]);
// 11
console.log(result);