Замыкания в 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)); // 28 alert(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 = 4 math(3).add(3).result(); // вывод : result = 6 math(4).add(3).result(); // вывод : result = 7 math(3).add(3).sub(1).result(); // вывод : result = 5 = 3+3-1 |