Замыкания в Javascript - ситуации, при которых функция возвращает другую функцию (или даже саму себя).
Они помогают скрыть реализацию функций, а также строить более сложные, динамические вызовы функций.
Для простого сокрытия реализации используется такая система:
Пользователь функции sum может и не знать, как считаются числа a и b. Ему не придется видеть громоздкие вычисления.
Также вернуть можно и вложенную в библиотеку функцию.
Тоже хорошей идеей будет спрятать реализацию класса в его прототип.
А замыкание сделать собственной функцией, для возможного множественного вызова функций.
Основная функция (оболочка) math будет содержать ссылку на объект библиотеки.
Код библиотеки будет красив, локоничен, а её функции будут перечислены в прототипе.
Плюс такой вид замыкания позволит пользоваться одним вызовом библиотеки и множественном вызове её функций для
того же контекста.
Например:
Количество вызовов функций почти неограничено, и для одного первоначального набора вводных данных можно проделать большой объем различной работы.
Так длина конечного кода для пользователя будет сокращена до одной строчки, а процесс написания кода более результативным.
P.S. Такой подход используется в реализации функций библиотеки jQuery. Замыкание функции на себе, позволяет выполнять несколько разнотипных действий при вызове лишь одного селектора $ (называется чейнинг (от англ. chaining - формирование цепочки)).
Спасибо за внимание.
1 2 3 4 5 | function library (a, b) { return a + b;}function sum(a, b) { return library(a, b) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | function summator (a) { return function(b) { a + b };} //Вызов выглядит так:alert(summator(3)(2));//Результат: 5//Преимущество такой записи в реиспользовании:var addThree = summator(3);alert(addThree(25)); // 28alert(addThree(11)); // 14 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | function MathLib(initVal) { var result = initVal || 0; this.result = function () { return result }; this.add = function (val) { if (typeof val !== 'undefined') { result = this.sum(result, val); } return this; }; this.sub = function (val) { if (typeof val !== 'undefined') { result = this.subtract(result, val); } return this; };}MathLib.prototype = new function MathLibPrototype() { this.sum = function (a, b) { return a + b; } this.subtract = function (sub) { return a - b; }}function math(initVal) { return new MathLib(initVal);} |
1 2 3 4 5 6 7 8 9 10 11 | math(4).result();// вывод : result = 4math(3).add(3).result();// вывод : result = 6math(4).add(3).result();// вывод : result = 7math(3).add(3).sub(1).result();// вывод : result = 5 = 3+3-1 |