52. Функции как объекты.
Функции в JavaScript являются полноценными объектами. Заметим, что оператор typeof
возвращает для функций не “object
”, а “function
”.
Вызов bind()
возвращает новую функцию, у которой контекст вызова this
жёстко установлен в указанное значение:
function f(y) { return this.x + y; }
var obj = { x : 10 };
var g = f.bind(obj); // вызов g(x) вызовет obj.f(x)
var result = g(2); // result = 12
При вызове bind() можно закрепить не только this, но и значения некоторых аргументов функции:
function f(y) { return this.x + y; }
var obj = { x : 10 };
var g = f.bind(obj, 2);
// теперь вызов g() всегда означает obj.f(2)
var result = g(); // result = 12
function sum(x, y, z) {
return x + y + z;
}
// контекст не используется, поэтому null
// фиксируем: x = 1, y = 2
// (это называется каррирование или карринг)
var sumOneTwo = sum.bind(null, 1, 2);
var result = sumOneTwo(10); // result = 13
Так как функции – это объекты, их можно хранить и обрабатывать как объекты:
В JavaScript к объекту можно в любой момент присоединить и инициализировать новое свойство.
Можно передавать одни функции в качестве аргументов другим функциям.
Вполне возможно, что объект-функция возвращается другой функцией.