Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_pechatat (1).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
400.16 Кб
Скачать

39. Функции замыкания и обратного вызова (callback) в js. Роль функций обратного вызова в организации асинхронного обмена данными (на примере Node.Js).

Замыкания – внутренние вложенные функции. Их можно вызвать из любого место кода. Если есть одноимённая переменная во внутренней и внешей функции, то внутреняя функция будет брать переменную из внешней, считая её глобальной. Пр:

for (var i = 0; i < links.length; i++) {

links[i].onclick = function() {

alert(i); - тут выведет не порядковый номер ссылки, как задумывалось, а каждый раз длину массива ссылок.

  }

}

Функция обратного вызова — это функция, которая передается другой функции в качестве параметра и та, в свою очередь, вызывает переданную функцию.

Когда мы передаем функцию в качестве параметра другой функции, мы можем вызвать ее в любой момент внутри содержащей функции, как если бы функция обратного вызова была определена внутри содержащей функции. Это значит, что по сути функция обратного вызова является замыканием. Замыкания имеют доступ к области видимости содержащей функции, а значит могут использовать любые переменные, определенные внутри содержащей функции.

 Далее приведен простой пример callback-функции:

1

2

3

4

5

6

7

8

function mySandwich(param1, param2, callback) {

    alert('Started eating my sandwich.\n\nIt has: ' + param1 + ', ' + param2);

    callback();

}

 

mySandwich('ham', 'cheese', function() {

    alert('Finished eating my sandwich.');

});

Здесь мы видим функцию mySandwich, которая принимает 3 параметра. Третий параметр — функция обратного вызова. Когда функция выполняется, она выводит на экран сообщение с переданными значениями. Затем выполняется функция обратного вызова.

Обратите внимание, что фактический параметр mySandwich является просто «callback» (без скобок), но потом, когда мы вызываем callback, мы используем круглые скобки.

Функция обратного вызова является альтернативой полиморфизму функций, а именно, позволяет создавать функции более общего назначения вместо того, чтобы создавать серию функций, одинаковых по структуре, но отличающихся лишь в отдельных местах исполняемыми подзадачами.

Для Node.js характерно использование асинхронных вызовов. По существу вы пишете, что нужно делать, и когда это будет сделано, будет вызван обратный вызов, потому что node.js однопоточен. Пока вы ждёте запуска обратного вызова, Node.js может уйти и делать другие вещи вместо блокировки до завершения запроса.

Это особенно важно для веб-серверов. Довольно характерно для современных веб-приложений иметь доступ к базам данных. Пока вы ждёте возвращения результата от базы данных, Node может обрабатывать больше запросов. Это позволяет справляться с тысячами параллельных запросов с маленькими накладными расходами по сравнению с созданием отдельного потока для каждого соединения. 

40. Управление зависимостями: принципы модульного программирования в js. Концепции amd.

Модульный подход - распространённая техника программирования в JS.

Анонимные замыкания

Эта основополагающая конструкция лежит в основе всего. Мы просто создаём анонимную функцию, и немедленно её исполняем. =

(function () { // все var-ы и ф-и внутри этого контекста

// по-прежнему имеется доступ к глобальным переменным }());

Глобальный импорт

Передавая глоб в качестве параметров анонимной функции, мы импортируем их в наш код, что и чётче, и быстрее, чем умолчательные глоб. Например:

(function ($, YAHOO) {

// теперь в коде есть доступ к переменным jQuery (как $) и YAHOO

}(jQuery, YAHOO));

Экспорт модуля

Иногда вы хотите не просто использовать глоб, вы хотите их объявить. Мы можем это легко сделать, экспортируя их через возвращаемое значение анонимной функции. Этот приём завершает основной модульный подход, вот полный пример:

var MODULE = (function () {

var my = {},

privateVariable = 1;

function privateMethod() { }

my.moduleProperty = 1;

my.moduleMethod = function () { };

return my; }());

Использование подхода AMD сводится к описанию модулей функций define и подключению их с помощью require. На данный момент есть несколько инструментов, реализующих AMD.

Подключение загрузчика

Для начала, подключим в index.html загрузчик. Будем использовать RequireJS:

<script data-main="/js/app" src="/js/require.js"></script>

Описание модуля

Опишем наш модуль в /js/module.js с помощью define:

define(

'mymodule',

['jquery'],

function( $ ){\\ возвращать она должна сам модуль. В данном случае это объект с одним полем.

return { foo : 'bar' }; });

Использование

В /js/app.js подключим нужные модули с помощью JS и выполним свой код:

require(

['mymodule', 'jquery'],

function( Module, $ ){

$('body').append( Module.foo ); } );

Module при этом не будет доступна в глобальной области видимости, как и другие переменные, экспортируемые библиотеками из зависимостей. Не смотря на то, что библиотека jQuery с версии 1.7 поддерживает AMD-архитектуру, она является исключением: экспортирует свой доллар в глобальную область видимости. Скорее всего, это сделано для сохранения совместимости с армией плагинов, написанных за многие годы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]