Yutex - Платный хостинг PHP.
Advego.ru - система покупки и продажи контента для сайтов, форумов и блогов

Технические фишки инфобизнеса 2014

Статьи для сайтов!!!
Дизайн сайтов
Функциональные выражения Передача функции в функцию 99 бутылок пива

Функции как первоклассные значения в Javascript - Передача функции в качестве параметра другой функции

Количество просмотров: 170

В информатике существует термин «Первоклассные значения». Javascript это тот язык, в котором это понятие применимо к функциям.

Но обо всем по порядку... Сначала ответим на вопрос: что такое первоклассные значения в программировании?

Для первоклассных значений характерно следующее:

  • Их можно присваивать переменным или сохранять/заносить в массив или объект
  • Передавать эти значения функциям в качестве параметра
  • Возвращать из функций

В Javascript все перечисленные действия можно выполнять с функциями. То есть функцию можно присвоить переменной, передать в другую функцию в качестве параметра или вернуть из функции.

Здесь мы уже говорили о том, что функции в Javascript можно рассматривать как значения. А также о том, как происходит присваивание функции переменной.

Поэтому далее поговорим о том, как происходит передача функции в качестве параметра в другую функцию.

Первоклассные значения в javascript?

Как Вы знаете (если нет, то читайте об этом здесь) в Javascript существует 5 псевдоложных значений:

  • undefined - неопределенное значение
  • null - несуществующий объект
  • 0 - ноль
  • empty string - пустая строка
  • NaN - не число

А вот примеры псевдоистинных значений:

  • object - объект
  • array - массив
  • number - число
  • string - строка

Напомним, что псевдоложные значения при составлении условий возвращают ложь false, а псевдоистинные, соответственно, истину true.

Передача функции в качестве параметра в другую функцию и присвоение функции переменной

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

Каждый объект массива состоит из двух свойств: value и returned. Первое содержит название одного из псевдоложных значений, значением второго является ложь - false:

var pseudo_false =
[
{value: 'undefined', returned: false},
{value: 'null', returned: false},
{value: '0', returned: false},
{value: 'empty string', returned: false},
{value: 'array', returned: false},
]

То есть исходный массив - это своего рода структура данных, которая содержит перечень всех псевдоложных значений и указание на то, что все они при составлении условий возвращают ложь false.

Сделаем в нашей структуре некоторые изменения: Во-первых, укажем, что одно из псевдоложных значений возвращает истину true, что является ошибкой и, во-вторых, вместо одного из псевдоложных значений укажем псевдоистиное, что также не допустимо, так как предполагается, что исходный массив должен содержать исключительно псевдоложные значения.

var pseudo_false =
[
{value: 'undefined', returned: false},
{value: 'null', returned: true}, /* ошибка */
{value: '0', returned: false},
{value: 'string', returned: false}, /* ошибка */
{value: 'array', returned: false},
]

Итак, в массиве из объектов сделано две ошибки:

1. В нем присутствует псевдоистиное значение string.

2. Указано, что псевдоложное значение null возвращает истину true.

Используя передачу функции в качестве параметра другой функции, проверим массив и выявим ошибки. Для этого:

Составим одну основную функцию, которая будет перебирать все значения массива, то есть каждый из объектов.

function analysis_each(array, analysis_function){
for(i = 0; i < array.length; i++){

if(analysis_function(array[i])){ /* if true */
return false

}
}
return true
}

Немного комментариев

  • Функция analysis_each анализирует каждый элемент массива array на предмет его истинности (мы будем анализировать массив pseudo_false).
  • Функция возвращает false, если условие истинно и на этом заканчивает свою работу. Если же условие ложно, то цикл повторяется.
  • Если ошибок в массиве не найдено, то функция возвращает true.

Теперь составим вспомогательные функции, которые мы будем передавать в качестве параметра в основную функцию.

С помощью 1-ой в условии функции analysis_each будут рассматриваться значения свойства returned каждого объекта массива. На данном этапе задача состоит в том, чтобы выяснить, есть ли среди них true.

function analysis_returned(array){
return (array.returned);
}

2-я функция предназначена для сравнения значения свойства value каждого объекта массива с псевдоистиным значением string. Результат этого сравнения также будет фигурировать в условии основной функции.

function analysis_value(array){
return (array.value == "string");
}

Теперь мы можем приступить к тому, ради чего написана эта статья: к передаче функции в качестве параметра в другую функцию.

Итак, передаем поочередно каждую из вспомогательных функций analysis_returned и analysis_value в основную функцию analysis_each.

При этом каждый раз функцию analysis_each будем присваивать переменной...

var search_true = analysis_each(pseudo_false, analysis_returned);
if(!search_true)
{
console.log('Ошибка, одному из псевдоложных значений присвоена ИСТИНА');
}

var search_string = analysis_each(pseudo_false, analysis_value);
if(!search_string)
{
console.log('Внимание, в списке псевдоложных значений присутствует псевдоИСТИНОЕ значение "string"');
}

Немного комментариев

  • Функция analysis_returned будучи переданной в качестве параметра в analysis_each позволяет проверить значение свойства returned каждого объекта массива pseudo_false.
  • Функция analysis_value при передачи в функцию analysis_each позволяет проверить свойство value каждого объекта массива pseudo_false.
  • Одновременно с этим мы дважды присваиваем функцию analysis_each различным переменным.

Далее приведен весь код этого примера...

<script type="text/javascript">

/* Массив из объектов: псевдо ЛОЖНЫЕ значения */
var pseudo_false =
[
{value: 'undefined', returned: false},
{value: 'null', returned: true},
/* ошибка */
{value: '0', returned: false},
{value: 'string', returned: false},
/* ошибка */
{value: 'array', returned: false},
]


/* Основная функция analysis_each перебирает все элементы массива (все объекты), каждый из которых является параметром функции analysis_function */
function analysis_each(array, analysis_function){
for(i = 0; i < array.length; i++){
if(analysis_function(array[i])){
/* if true */
return false
}
}
return true
}


/* Функция для анализа свойства returned */
function analysis_returned(array){
return (array.returned);
}

/* Функция для анализа свойства value */
function analysis_value(array){
return (array.value == 'string');
}



/* Присваивание функций переменным */
var search_true = analysis_each(pseudo_false, analysis_returned);
if(!search_true){
console.log('Ошибка, одному из псевдо ЛОЖНЫХ значений присвоена ИСТИНА');
}
else{
console.log('No Error');
}


var search_string = analysis_each(pseudo_false, analysis_value);
if(!search_string){
console.log(
'Внимание, в списке псевдоложных значений присутствует псевдоИСТИНОЕ значение "string"');
}
else{
console.log('No Error');
}

</script>

Передача функции другой функции и присваивание функции переменной

Ошибка, одному из псевдо ЛОЖНЫХ значений присвоена ИСТИНА

Внимание, в списке псевдоложных значений присутствует псевдоИСТИНОЕ значение "string"

Передача функции в функцию - Тонкости и нюансы

Далее составим массив из псевдоиcтинных значений.

var pseudo_true =
[
{value: 'object', returned: true},
{value: 'array', returned: true},
{value: 'number', returned: true},
{value: 'string', returned: true},
]

Сделаем в нем ошибку:

var pseudo_true =
[
{value: 'object', returned: true},
{value: 'array', returned: false}, /* ошибка */
{value: 'number', returned: true},
{value: 'string', returned: true},
]

И попробуем проверить... Ищем в массиве false.

При этом функция analysis_returned не сможет нам в этом помочь!!! Почему?

Потому, что значения свойств returned в массиве pseudo_true в основном равны true. Как вы помните, если в условии функции analysis_each будет истина, то она выдаст нам false, а значит ошибку, в то время как в данном случае ошибки нет!!!

Выходит, что мы увидим ошибку в любом случае: есть она или нет!!!

Значит, для проверки массива pseudo_true нужна отдельная вспомогательная функция. Назовем ее analysis_returned_true.

function analysis_returned_true(array){
return (!array.returned);
}

Как видите функция analysis_returned_true идентична функции analysis_returned, но с одной существенной разницей: благодаря восклицательному знаку !array.returned мы будем получать значение свойства returned противоположное реально существующему.

Так как же теперь будет работать функция analysis_each, если в нее в качестве параметра передать функцию analysis_returned_true?

Напомним, как выглядит функция analysis_each:

function analysis_each(array, analysis_function){
for(i = 0; i < array.length; i++){

if(analysis_function(array[i])){ /* if true */
return false

}
}
return true
}

Немного комментариев

  • Теперь значения true свойства returned массива pseudo_true будут фигурировать в условии функции analysis_each как ложные, и цикл будет повторяться.
  • Если же свойство returned будет равно false, то в условии функции analysis_each окажется истина true и проверка будет остановлена. Таким образом, ошибка будет найдена.

Далее приведен весь код, где мы работаем с массивом из псевдоистинных значений...

<script type="text/javascript">

/* Массив из объектов: псевдо ИСТИННЫЕ значения */
var pseudo_true =
[
{value: 'object', returned: true},
{value: 'array', returned: true},
{value: 'number', returned: false},
/* ошибка */
{value: 'string', returned: true},
]

/* Основная функция analysis_each перебирает все элементы массива (все объекты), каждый из которых является параметром функции analysis_function */
function analysis_each(array, analysis_function){
for(i = 0; i < array.length; i++){
if(analysis_function(array[i])){ /* if true */
return false
}
}
return true
}

/* Функция для анализа свойства returned */
function analysis_returned_true(array){
return (!array.returned);
}

/* Присваивание функций переменной */
var search_false = analysis_each(pseudo_true, analysis_returned_true);
if(!search_false){
console.log('Ошибка, одному из псевдо ИСТИННЫХ значений присвоена ЛОЖЬ');
}
else{
console.log('No Error');
}

</script>

Передача функции в качестве параметра в другую функцию - Пример №2

Ошибка, одному из псевдо ИСТИННЫХ значений присвоена ЛОЖЬ

В зависимости от способностей, тема передачи функции другой функции может оказаться довольно сложной для понимания. Но постарайтесь вникнуть.

Частота просмотра уроков
JavaScript
Функциональные выражения Передача функции в функцию 99 бутылок пива

Ваши комментарии:

Комментариев нет...

Добавить комментарий:

Ваше Имя:*
Комментарий:*
Ответьте на вопрос: *
Сколько дней в Високосном году?
* - поля обязательные для заполнения.
ПОИСК ПО САЙТУ:

Моё имя Антон. Связаться со мною Вы можете по e-mail: averagev@mail.ru